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
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