Ejemplo n.º 1
0
    def verdict(self):
        from r2.models import Jury
        from r2.lib.utils.trial_utils import update_voting

        koshers = 0
        spams = 0
        nones = 0

        now = datetime.now(g.tz)
        defendant_age = now - self.defendant._date
        if defendant_age.days > 0:
            return ("jury timeout", None, None)

        latest_juryvote = None
        for j in Jury.by_defendant(self.defendant):
            if j._name == "0":
                nones += 1
                continue

            # For non-zero votes, update latest_juryvote
            if latest_juryvote is None:
                latest_juryvote = j._date
            else:
                latest_juryvote = max(latest_juryvote, j._date)

            if j._name == "1":
                koshers += 1
            elif j._name == "-1":
                spams += 1
            else:
                raise ValueError("weird jury vote: [%s]" % j._name)

        # The following trace is temporary; it'll be removed once this
        # is done via cron job as opposed to manually
        print "%d koshers, %d spams, %d haven't voted yet" % (koshers, spams, nones)

        update_voting(self.defendant, koshers, spams)

        total_votes = koshers + spams

        if total_votes < 7:
            g.log.debug("not enough votes yet")
            return (None, koshers, spams)

        # Stop showing this in the spotlight box once it has 20 votes
        if total_votes >= 20:
            g.cache.set("quench_jurors-" + self.defendant._fullname, True)
            quenching = True
        else:
            quenching = False

        # If a trial is less than an hour old, and votes are still trickling
        # in (i.e., there was one in the past five minutes), we're going to
        # require a nearly unanimous opinion to end the trial without
        # waiting for more votes.
        if defendant_age.seconds < 3600 and (now - latest_juryvote).seconds < 300:
            trickling = True
        else:
            trickling = False

        kosher_pct = float(koshers) / float(total_votes)

        if kosher_pct < 0.13:
            return ("guilty", koshers, spams)
        elif kosher_pct > 0.86:
            return ("innocent", koshers, spams)
        elif trickling:
            g.log.debug("votes still trickling in")
            return (None, koshers, spams)
        elif kosher_pct < 0.34:
            return ("guilty", koshers, spams)
        elif kosher_pct > 0.66:
            return ("innocent", koshers, spams)
        elif not quenching:
            g.log.debug("not yet quenching")
            return (None, koshers, spams)
        # At this point, we're not showing the link to any new jurors, and
        # the existing jurors haven't changed or submitted votes for several
        # minutes, so we're not really expecting to get many more votes.
        # Thus, lower our standards for consensus.
        elif kosher_pct < 0.3999:
            return ("guilty", koshers, spams)
        elif kosher_pct > 0.6001:
            return ("innocent", koshers, spams)
        elif total_votes >= 100:
            # This should never really happen; quenching should kick in
            # after 20 votes, so new jurors won't be assigned to the
            # trial. Just in case something goes wrong, close any trials
            # with more than 100 votes.
            return ("hung jury", koshers, spams)
        else:
            g.log.debug("hung jury, so far")
            return (None, koshers, spams) # no decision yet; wait for more voters
Ejemplo n.º 2
0
    def verdict(self):
        from r2.models import Jury
        from r2.lib.utils.trial_utils import update_voting

        koshers = 0
        spams = 0
        nones = 0

        now = datetime.now(g.tz)
        defendant_age = now - self.defendant._date
        if defendant_age.days > 0:
            return ("jury timeout", None, None)

        latest_juryvote = None
        for j in Jury.by_defendant(self.defendant):
            if j._name == "0":
                nones += 1
                continue

            # For non-zero votes, update latest_juryvote
            if latest_juryvote is None:
                latest_juryvote = j._date
            else:
                latest_juryvote = max(latest_juryvote, j._date)

            if j._name == "1":
                koshers += 1
            elif j._name == "-1":
                spams += 1
            else:
                raise ValueError("weird jury vote: [%s]" % j._name)

        # The following trace is temporary; it'll be removed once this
        # is done via cron job as opposed to manually
        print "%d koshers, %d spams, %d haven't voted yet" % (koshers, spams,
                                                              nones)

        update_voting(self.defendant, koshers, spams)

        total_votes = koshers + spams

        if total_votes < 7:
            g.log.debug("not enough votes yet")
            return (None, koshers, spams)

        # Stop showing this in the spotlight box once it has 20 votes
        if total_votes >= 20:
            g.cache.set("quench_jurors-" + self.defendant._fullname, True)
            quenching = True
        else:
            quenching = False

        # If a trial is less than an hour old, and votes are still trickling
        # in (i.e., there was one in the past five minutes), we're going to
        # require a nearly unanimous opinion to end the trial without
        # waiting for more votes.
        if defendant_age.seconds < 3600 and (now -
                                             latest_juryvote).seconds < 300:
            trickling = True
        else:
            trickling = False

        kosher_pct = float(koshers) / float(total_votes)

        if kosher_pct < 0.13:
            return ("guilty", koshers, spams)
        elif kosher_pct > 0.86:
            return ("innocent", koshers, spams)
        elif trickling:
            g.log.debug("votes still trickling in")
            return (None, koshers, spams)
        elif kosher_pct < 0.34:
            return ("guilty", koshers, spams)
        elif kosher_pct > 0.66:
            return ("innocent", koshers, spams)
        elif not quenching:
            g.log.debug("not yet quenching")
            return (None, koshers, spams)
        # At this point, we're not showing the link to any new jurors, and
        # the existing jurors haven't changed or submitted votes for several
        # minutes, so we're not really expecting to get many more votes.
        # Thus, lower our standards for consensus.
        elif kosher_pct < 0.3999:
            return ("guilty", koshers, spams)
        elif kosher_pct > 0.6001:
            return ("innocent", koshers, spams)
        elif total_votes >= 100:
            # This should never really happen; quenching should kick in
            # after 20 votes, so new jurors won't be assigned to the
            # trial. Just in case something goes wrong, close any trials
            # with more than 100 votes.
            return ("hung jury", koshers, spams)
        else:
            g.log.debug("hung jury, so far")
            return (None, koshers, spams
                    )  # no decision yet; wait for more voters