PonyConf/proposals/models.py

67 lines
2.1 KiB
Python

from enum import IntEnum
from django.contrib.auth.models import User
from django.contrib.sites.managers import CurrentSiteManager
from django.contrib.sites.models import Site
from django.core.urlresolvers import reverse
from django.db import models
from autoslug import AutoSlugField
from sortedm2m.fields import SortedManyToManyField
from accounts.models import Participation
from ponyconf.utils import PonyConfModel, enum_to_choices
__all__ = ['Topic', 'Talk']
class Topic(PonyConfModel):
name = models.CharField(max_length=128, verbose_name='Name', unique=True)
slug = AutoSlugField(populate_from='name', unique=True)
reviewers = models.ManyToManyField(Participation, blank=True)
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('list-talks-by-topic', kwargs={'topic': self.slug})
class Talk(PonyConfModel):
EVENTS = IntEnum('Event', 'conference_short conference_long workshop stand other')
site = models.ForeignKey(Site, on_delete=models.CASCADE)
proposer = models.ForeignKey(User, related_name='+')
speakers = SortedManyToManyField(User)
title = models.CharField(max_length=128, verbose_name='Title')
slug = AutoSlugField(populate_from='title', unique=True)
description = models.TextField(blank=True, verbose_name='Description')
topics = models.ManyToManyField(Topic, blank=True)
event = models.IntegerField(choices=enum_to_choices(EVENTS), default=EVENTS.conference_short.value)
objects = models.Manager()
on_site = CurrentSiteManager()
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('show-talk', kwargs={'slug': self.slug})
def is_editable_by(self, user):
if user.is_superuser:
return True
if user == self.proposer:
return True
if user in self.speakers.all():
return True
try:
participation = Participation.on_site.get(user=user)
except Participation.DoesNotExists:
return False
return participation.orga or self.topics.filter(reviewers=participation).exists()