def POST(self): if not session().logged: raise web.seeother('/register') i = web.input(authors="", url=None, title=None, comments=[], year=None, enabled=False, subtitle='', time=datetime.utcnow(), votes=1, cite={'mla': '', 'apa': '', 'chicago': ''}) db = Db('db/openjournal') def next_pid(): papers = db.get('papers') return papers[-1]['pid'] + 1 if papers else 0 i.submitter = session()['uname'] if i.authors: i.authors = map(self.parse_author, i.authors.split(',')) i.pid = next_pid() record_submission(i.submitter, i.pid) record_vote(i.submitter, i.submitter, i.pid) db.append('papers', dict(i)) Search().index() raise web.seeother('/')
def GET(self): """Research http://news.ycombinator.com/item?id=1781013 how hacker news voting works and emulate XXX Restrict voting to session().logged users + element id must not already exist in user['votes'] set. XXX Requires accounting + record keeping XXX Preserve the web.ctx GET query params to preserve sorting / ordering Algo: 1. Add karma to paper['submitter'] if vote 2. Record vote in user['votes'] set by id - calc unique vote id via some linear combination of paper pid (and or comment id [cid], if it exists) """ msg = None i = web.input(pid=None, sort="popular") if not session().logged: raise web.seeother('/register') db = Db('db/openjournal') ps = db.get('papers') u = User.get(session()['uname']) if i.pid: i.pid = int(i.pid) if canvote(u, i.pid): try: ps[i.pid]['votes'] += 1 db.put('papers', ps) submitter_uname = ps[i.pid]['submitter'] record_vote(u['username'], submitter_uname, i.pid) except IndexError: return "No such items exists to vote on" raise web.seeother('/?sort=%s' % i.sort)