# -*- coding: utf-8 -*-
from datetime import datetime
from decimal import Decimal
from django.db import models
from django.db.models import Q
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from markitup.fields import MarkupField
from symposion.proposals.models import ProposalBase
# from symposion.schedule.models import Presentation
from symposion.schedule.models import Presentation
class ProposalScoreExpression(object):
def as_sql(self, qn, connection=None):
sql = "((3 * plus_one + plus_zero) - (minus_zero + 3 * minus_one))"
return sql, []
def prepare_database_save(self, unused):
return self
class Votes(object):
PLUS_ONE = "+1"
PLUS_ZERO = "+0"
MINUS_ZERO = u"−0"
MINUS_ONE = u"−1"
CHOICES = [
(PLUS_ONE, u"+1 — Good proposal and I will argue for it to be accepted."),
(PLUS_ZERO, u"+0 — OK proposal, but I will not argue for it to be accepted."),
(MINUS_ZERO, u"−0 — Weak proposal, but I will not argue strongly against acceptance."),
(MINUS_ONE, u"−1 — Serious issues and I will argue to reject this proposal."),
]
@@ -258,52 +258,51 @@ class ProposalResult(models.Model):
setattr(self, mapping[vote], models.F(mapping[vote]) - 1)
self.comment_count = models.F("comment_count") - 1
else:
setattr(self, mapping[vote], models.F(mapping[vote]) + 1)
self.comment_count = models.F("comment_count") + 1
self.save()
model = self.__class__
model._default_manager.filter(pk=self.pk).update(score=ProposalScoreExpression())
class Comment(models.Model):
proposal = models.ForeignKey("proposals.ProposalBase", related_name="comments")
commenter = models.ForeignKey(User)
text = MarkupField()
# Or perhaps more accurately, can the user see this comment.
public = models.BooleanField(choices=[
(True, "public"),
(False, "private"),
])
commented_at = models.DateTimeField(default=datetime.now)
def promote_proposal(proposal):
raise NotImplementedError()
# presentation, created = Presentation.objects.get_or_create(
# pk=proposal.pk,
# defaults=dict(
# title=proposal.title,
# description=proposal.description,
# kind=proposal.kind,
# category=proposal.category,
# duration=proposal.duration,
# abstract=proposal.abstract,
# audience_level=proposal.audience_level,
# submitted=proposal.submitted,
# speaker=proposal.speaker,
# )
# if created:
# for speaker in proposal.additional_speakers.all():
# presentation.additional_speakers.add(speaker)
# presentation.save()
# return presentation
if hasattr(proposal, "presentation") and proposal.presentation:
# already promoted
presentation = proposal.presentation
presentation = Presentation(
title = proposal.title,
description = proposal.description,
abstract = proposal.abstract,
speaker = proposal.speaker,
section = proposal.section,
_proposal = proposal,
)
presentation.save()
for speaker in proposal.additional_speakers.all():
presentation.additional_speakers.add(speaker)
return presentation
def accepted_proposal(sender, instance=None, **kwargs):
if instance is None:
return
if instance.accepted == True:
promote_proposal(instance.proposal)
post_save.connect(accepted_proposal, sender=ProposalResult)