Changeset - 08698e53265b
[Not reviewed]
Merge
0 4 0
Scott Bragg - 8 years ago 2016-06-18 08:12:19
jsbragg@scriptforge.org
Merge pull request #15 from lca2017/chrisjrn/002-abstain

Fixes two bugs in abstain voting
1 file changed with 21 insertions and 2 deletions:
0 comments (0 inline, 0 general)
symposion/reviews/models.py
Show inline comments
 
# -*- coding: utf-8 -*-
 
from __future__ import unicode_literals
 
from datetime import datetime
 
from decimal import Decimal
 

	
 
from django.core.exceptions import ValidationError
 

	
 
from django.db import models
 
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.contrib.auth.models import User
 
from django.utils.translation import ugettext_lazy as _
 

	
 
from symposion.markdown_parser import parse
 
from symposion.proposals.models import ProposalBase
 
from symposion.schedule.models import Presentation
 

	
 

	
 
def score_expression():
 
    return (
 
    score = (
 
        (2 * F("plus_two") + F("plus_one")) -
 
        (F("minus_one") + 2 * F("minus_two"))
 
    ) / (
 
        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):
 
    ABSTAIN = "0"
 
    PLUS_TWO = "+2"
 
    PLUS_ONE = "+1"
 
    MINUS_ONE = "−1"
...
 
@@ -117,16 +125,27 @@ class Review(models.Model):
 
    proposal = models.ForeignKey(ProposalBase, related_name="reviews", verbose_name=_("Proposal"))
 
    user = models.ForeignKey(User, verbose_name=_("User"))
 

	
 
    # No way to encode "-0" vs. "+0" into an IntegerField, and I don't feel
 
    # like some complicated encoding system.
 
    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)
 
    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):
 
        self.comment_html = parse(self.comment)
 
        if self.vote:
 
            vote, created = LatestVote.objects.get_or_create(
 
                proposal=self.proposal,
 
                user=self.user,
0 comments (0 inline, 0 general)