Merge pull request #15 from lca2017/chrisjrn/002-abstain

Fixes two bugs in abstain voting
This commit is contained in:
Scott Bragg 2016-06-18 18:12:19 +10:00 committed by GitHub
commit 08698e5326

View file

@ -3,8 +3,11 @@ from __future__ import unicode_literals
from datetime import datetime from datetime import datetime
from decimal import Decimal from decimal import Decimal
from django.core.exceptions import ValidationError
from django.db import models from django.db import models
from django.db.models import Q, F from django.db.models import Q, F
from django.db.models import Case, When, Value
from django.db.models.signals import post_save from django.db.models.signals import post_save
from django.contrib.auth.models import User from django.contrib.auth.models import User
@ -16,13 +19,18 @@ from symposion.schedule.models import Presentation
def score_expression(): def score_expression():
return ( score = (
(2 * F("plus_two") + F("plus_one")) - (2 * F("plus_two") + F("plus_one")) -
(F("minus_one") + 2 * F("minus_two")) (F("minus_one") + 2 * F("minus_two"))
) / ( ) / (
F("vote_count") - F("abstain") * 1.0 F("vote_count") - F("abstain") * 1.0
) )
return Case(
When(vote_count=F("abstain"), then=Value("0")), # no divide by zero
default=score,
)
class Votes(object): class Votes(object):
ABSTAIN = "0" ABSTAIN = "0"
@ -120,10 +128,21 @@ class Review(models.Model):
# No way to encode "-0" vs. "+0" into an IntegerField, and I don't feel # No way to encode "-0" vs. "+0" into an IntegerField, and I don't feel
# like some complicated encoding system. # like some complicated encoding system.
vote = models.CharField(max_length=2, blank=True, choices=VOTES.CHOICES, verbose_name=_("Vote")) vote = models.CharField(max_length=2, blank=True, choices=VOTES.CHOICES, verbose_name=_("Vote"))
comment = models.TextField(verbose_name=_("Comment")) comment = models.TextField(
blank=True,
verbose_name=_("Comment")
)
comment_html = models.TextField(blank=True) comment_html = models.TextField(blank=True)
submitted_at = models.DateTimeField(default=datetime.now, editable=False, verbose_name=_("Submitted at")) submitted_at = models.DateTimeField(default=datetime.now, editable=False, verbose_name=_("Submitted at"))
def clean(self):
err = {}
if self.vote != VOTES.ABSTAIN and not self.comment.strip():
err["comment"] = ValidationError(_("You must provide a comment"))
if err:
raise ValidationError(err)
def save(self, **kwargs): def save(self, **kwargs):
self.comment_html = parse(self.comment) self.comment_html = parse(self.comment)
if self.vote: if self.vote: