def get_reported_authors(cls, time = None, sort = None): reports = {} for t_cls in (Link, Comment, Message): q = t_cls._query(t_cls.c._spam == False, t_cls.c.reported > 0, data = True) q._sort = desc("_date") if time: q._filter(time) reports.update(Report.reported(things = list(q), amount = 0)) # at this point, we have a full list of reports made on the interval specified # build up an author to report list authors = Account._byID([k[1].author_id for k, v in reports.iteritems()], data = True) if reports else [] # and build up a report on each author author_rep = {} for (tattler, thing, amount), r in reports.iteritems(): aid = thing.author_id if not author_rep.get(aid): author_rep[aid] = Storage(author = authors[aid]) author_rep[aid].num_reports = 1 author_rep[aid].acct_correct = tattler.report_correct author_rep[aid].acct_wrong = tattler.report_ignored author_rep[aid].most_recent = r._date author_rep[aid].reporters = set([tattler]) else: author_rep[aid].num_reports += 1 author_rep[aid].acct_correct += tattler.report_correct author_rep[aid].acct_wrong += tattler.report_ignored if author_rep[aid].most_recent < r._date: author_rep[aid].most_recent = r._date author_rep[aid].reporters.add(tattler) authors = author_rep.values() if sort == "hot": def report_hotness(a): return a.acct_correct / max(a.acct_wrong + a.acct_correct,1) def better_reporter(a, b): q = report_hotness(b) - report_hotness(a) if q == 0: return b.acct_correct - a.acct_correct else: return 1 if q > 0 else -1 authors.sort(better_reporter) if sort == "top": authors.sort(lambda x, y: y.num_reports - x.num_reports) elif sort == "new": def newer_reporter(a, b): t = b.most_recent - a.most_recent t0 = datetime.timedelta(0) return 1 if t > t0 else -1 if t < t0 else 0 authors.sort(newer_reporter) return authors
def get_reported_authors(cls, time=None, sort=None): reports = {} for t_cls in (Link, Comment, Message): q = t_cls._query(t_cls.c._spam == False, t_cls.c.reported != 0, data=True) q._sort = desc("_date") if time: q._filter(time) reports.update(Report.reported(things=list(q), amount=0)) # at this point, we have a full list of reports made on the interval specified # build up an author to report list authors = Account._byID( [k[1].author_id for k, v in reports.iteritems()], data=True) if reports else [] # and build up a report on each author author_rep = {} for (tattler, thing, amount), r in reports.iteritems(): aid = thing.author_id if not author_rep.get(aid): author_rep[aid] = Storage(author=authors[aid]) author_rep[aid].num_reports = 1 author_rep[aid].acct_correct = tattler.report_correct author_rep[aid].acct_wrong = tattler.report_ignored author_rep[aid].most_recent = r._date author_rep[aid].reporters = set([tattler]) else: author_rep[aid].num_reports += 1 author_rep[aid].acct_correct += tattler.report_correct author_rep[aid].acct_wrong += tattler.report_ignored if author_rep[aid].most_recent < r._date: author_rep[aid].most_recent = r._date author_rep[aid].reporters.add(tattler) authors = author_rep.values() if sort == "hot": def report_hotness(a): return a.acct_correct / max(a.acct_wrong + a.acct_correct, 1) def better_reporter(a, b): q = report_hotness(b) - report_hotness(a) if q == 0: return b.acct_correct - a.acct_correct else: return 1 if q > 0 else -1 authors.sort(better_reporter) if sort == "top": authors.sort(lambda x, y: y.num_reports - x.num_reports) elif sort == "new": def newer_reporter(a, b): t = b.most_recent - a.most_recent t0 = datetime.timedelta(0) return 1 if t > t0 else -1 if t < t0 else 0 authors.sort(newer_reporter) return authors