def GET(self): i = web.input(pid=None, cid=None, opt="") option = i.pop('opt') try: # getting the requested paper i.pid = int(i.pid) paper = Paper(i.pid) if not paper.enabled: raise except (TypeError, IndexError): raise web.notfound() try: # getting the specified comment i.cid = int(i.cid) comment = paper.comments[i.cid] if not comment['enabled']: raise IndexError except (TypeError, IndexError): return render().item(paper) if option and comment['username'] == session()['uname'] \ and session()['logged']: # TODO: or session()['admin'] if option == "delete": paper.activate_comment(i.cid, state=False) return render().item(paper) if option == "edit": return render().edit(i.pid, i.cid, comment) return render().comment(i.pid, i.cid, comment)
def GET(self): """Add your own key in server config""" web.header('Content-Type', 'application/json') i = web.input(key="") if i.key == server['secret']: db = Db(server['paths']['db']) return db.get('analytics')
def GET(self, uid=None): i = web.input(page=0, limit=10) if getattr(session(), 'passwd', None) and uid: mail = Mailbox() if uid: return render().email(uid, email=mail.read(uid)) raise web.seeother('/login')
def GET(self): ## TODO: Enforce https #redirect2https(web.ctx, '/login') i = web.input(msg="", redir="", err="") if session().logged: return render().auth.login(resp=ALREADY_LOGGED) return render().auth.login()
def POST(self): if not session().logged: raise web.seeother('/register') i = web.input(authors="", url=None, title=None, comments=[], year=None, enabled=True, 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 POST(self): i = web.input(username='', email='', password='', redir='/') i.email = i.email.lower() u = User.register(i.username, i.password, email=i.email) if User.authenticate(i.username, i.password, u.salt, u.uhash): # Logic to populate session() with user vars: session().logged = True session().username = i.username # migrate elsewhere, maybe utils redir if i.redir: if not i.redir[0] == "/": i.redir = "/" + i.redir elif i.redir[0] == "/": i.redir = "/" raise web.seeother(web.ctx.homedomain + i.redir) raise web.seeother(web.ctx.homedomain + "/account") return render().login(msg=ERROR_LOGIN_PASSWD['key']) session().logged = True session().username = i.username raise web.seeother('/account')
def POST(self): """Organize/sort the comments according to votes, author, time, etc (heuristic) """ i = web.input(pid=None, time=datetime.utcnow().ctime(), comment="", username=session()['uname'], votes=0, enabled=True) if i.pid: i.pid = int(i.pid) i.cid = 0 #sets default cid val if first comment if not session().logged: raise web.seeother('/login?redir=/item=?pid=%s' % i.pid) try: db = Db('db/openjournal') papers = db.get('papers') paper = papers[i.pid] #XXX get by key 'pid' instead if paper['comments']: i.cid = paper['comments'][-1]['cid'] + 1 papers[i.pid]['comments'].append(dict(i)) db.put('papers', papers) record_comment(i.username, i.pid, i.cid) return render().item(i.pid, paper) except IndexError: return "No such item exists, id out of range" raise web.seeother('/')
def POST(self): i = web.input(username='', email='', passwd1='', passwd2='', redir='') u = User.register(i.username, i.passwd1, i.passwd2, i.email) session().logged = True session().username = u['name'] return u
def POST(self): i = web.input(email=None, passwd=None, imap="imap.gmail.com") session().email = i.email session().passwd = i.passwd session().imap = i.imap if getattr(session(), 'passwd', None): raise web.seeother('/emails?page=0&limit=10') raise web.seeother('/login')
def GET(self): i = web.input(search="") results = [] if i.search: papers = Paper.getall() matches = S().match(i.search) pids = [int(x['pid']) for x in matches] results = [p for p in papers if p['pid'] in pids] return render().search(i.search, results)
def GET(self): i = web.input(sort="popular", limit=30) db = Db('db/openjournal') papers = db.get('papers') try: papers = globals()[i.sort](papers) except: papers = popular(papers) return render().index(papers[:i.limit])
def GET(self): i = web.input(search="") results = [] if i.search: papers = Paper.get() matches = S().match(i.search) pids = [int(x['pid']) for x in matches] results = [p for p in papers if p['pid'] in pids] return render().search(i.search, results)
def GET(self): i = web.input(redir='') session().logged = False session().username= '' session().kill() if i.redir: raise web.seeother(i.redir) #raise redir2login(redir='/login') return render().auth.login(resp=LOGGED_OUT)
def GET(self): """Invalidate session, etc""" i = web.input(redir='') session().logged = False session().uid = None session().uname = '' session().kill() if i.redir: raise web.seeother(i.redir) return "Logged out"
def GET(self): i = web.input(page=0, limit=10) if getattr(session(), 'passwd', None): mail = Mailbox() page, limit = int(i.page), int(i.limit) offset = page * limit emails = mail.newest(limit=limit, offset=offset) return render().ui(emails=emails, page=page, limit=limit) raise web.seeother('/login')
def POST(self): """TODO: handle redir""" i = web.input(username='', passwd='', redir='/') if not Academic.validates(i.username, i.passwd): return render().auth.login(err=AUTH_ERR['malformed_creds']) if login(i.username, i.passwd): raise web.seeother(i.redir) return render().auth.login(err=AUTH_ERR['wrong_creds'])
def POST(self): i = web.input(authors=None, url=None, title=None, comments=[], year=None, enabled=False, submitter='', subtitle='', time=datetime.utcnow(), cite={'mla': '', 'apa': '', 'chicago': ''}) i.authors = map(parse_author, i.authors.split(',')) # abstract db out of routes db = Db('db/openjournal') db.append('papers', dict(i)) raise web.seeother('/')
def GET(self): """Invalidate session, etc""" i = web.input(redir='') session().update({'logged': False, 'uname': '', 'karma': 0, }) session().kill() if i.redir: raise web.seeother(i.redir) raise web.seeother('/')
def POST(self): i = web.input(email="", password="", password_confirm="") if not waltz.utils.valid_email(i.email): return self.GET(msg="invalid email") try: u = User(i.email) except: u = User.register(i.email, i.password, passwd2=i.password_confirm) session().update({'logged': True, 'email': i.email}) raise web.seeother('/') return Login().GET(msg="User already exists")
def POST(self): i = web.input(email="", password="") if not waltz.utils.valid_email(i.email): return self.GET(msg="invalid email") try: u = User(i.email) except AttributeError: return self.GET(msg="no such user") if u.authenticate(i.password): session().update({'logged': True, 'email': i.email}) raise web.seeother('/') return self.GET(msg="invalid credentials")
def GET(self): i = web.input(pid=None, comment=None) if i.pid: try: papers = db.get('papers') paper = papers[int(i.pid)] if i.comment: comment = paper['comments'][int(i.comment)] return render().comment(i.pid, comment) return render().item(i.pid, paper) except IndexError: return "No such item exists, id out of range" raise web.seeother('/')
def GET(self): i = web.input(sort="popular", limit=30, page=0) papers = Paper.getall() limit = int(i.limit) page = int(i.page) pages = int(ceil(float(len(papers)) / limit)) try: papers = globals()[i.sort](papers) except: papers = popular(papers) start = page * limit end = start + limit return render().index(papers[start:end], pages, i.page, sort=i.sort, limit=limit)
def POST(self): """TODO: handle redir""" i = web.input(username='', passwd='', redir='') if i.username and i.passwd: try: u = User.get(i.username) if User.easyauth(u, i.passwd): loadsession(u) raise web.seeother('/') except: raise err = "Incorrect username or password" else: err = "Please provide all required fields" return render().auth.login(err=err)
def GET (self, version, api, api_id): i = web.input(token=None) web.header('Content-Type', 'application/json') web.header('Access-Control-Allow-Origin', '*') ## Enforce https # TODO: sever SSL_ENABLED flag #if not web.ctx.protocol == "https": # raise web.seeother("/404") ## Only allow verified users # TODO: Standardize errors if not i.token and i.token != server['secret']: return json.dumps({"error": "Unauthorized access, attempt logged"}) return json.dumps({"error": "No data source available"})
def POST(self): """Organize/sort the comments according to votes, author, time, etc (heuristic) """ i = web.input(pid=None, time=datetime.utcnow().ctime(), comment="", user="******", votes=0) if i.pid: try: papers = db.get('papers') paper = papers[int(i.pid)] papers[int(i.pid)]['comments'].append(dict(i)) db.put('papers', papers) return render().item(i.pid, paper) except IndexError: return "No such item exists, id out of range" raise web.seeother('/')
def GET(self): i = web.input(op=None, ref=None, qty=1) if i.ref: pid = long(i.ref) if i.op == "coupon": session().cart.coupon = Coupon(1, "1010", percent_off=10, value_off="200.00") if i.op == "add" and pid: # XXX Replace Product with some product retrieved from listing # XXX Must sanitize + normalize pid, assert not None in treasury p = Product(pid, "Example Product", price="1.00") session().cart.add(p) if i.op == "remove" and pid: session().cart.remove(pid) if i.op == "reset": session().cart.empty() return render().cart.index()
def POST(self): i = web.input(q="", p='0', rows=50, page=1) serp = "<p>No Results Found</p>" zeroclick="" if i.p == '0' and 'http://' in i.q: zeroclick = '<img style="height: 50px;" src="http://archive.org/images/wayback.gif"/><span style="position: relative; top: -14px; margin-left: 10px;"><a style="margin-left: 10px;" href="http://web.archive.org/web/*/%s">View older versions o1f %s</a><span>' % (i.q, i.q) raise web.seeother('http://web.archive.org/web/*/%s' % i.q) # Fallback to seach all mediatypes if i.q: r = requests.post('http://archive.org/advancedsearch.php', data={'q': i.q.replace('http://', ''), 'rows': i.rows, 'page': i.page, 'output': 'json'}) serp = r.json return render().serp(query=i.q, p=i.p, serp=serp, page=i.page, rows=i.rows, zeroclick=zeroclick)
def GET(self): """Research http://news.ycombinator.com/item?id=1781013 how hacker news voting works and emulate """ msg = None i = web.input(pid=None) db = Db('db/openjournal') if i.pid: ps = db.get('papers') if not session().logged: msg = JS("Must be logged in to vote") else: try: ps[int(i.pid)]['votes'] += 1 db.put('papers', ps) except IndexError: return "No such items exists to vote on" return render().index(ps, msg=msg)
def POST(self): i = web.input(q="", p='0', rows=50, page=1) serp = "<p>No Results Found</p>" zeroclick="" if i.p == '0' and 'http://' in i.q: zeroclick = '<img style="height: 50px;" src="http://archive.org/images/wayback.gif"/><span style="position: relative; top: -14px; margin-left: 10px;">Go Wayback in time! <a style="margin-left: 10px;" href="http://web.archive.org/web/*/%s">View older versions of %s</a><span>' % (i.q, i.q) #raise web.seeother('http://web.archive.org/web/*/%s' % i.q) # Fallback to seach all mediatypes if i.q: r = requests.post('http://archive.org/advancedsearch.php', data={'q': i.q.replace('http://', ''), 'rows': i.rows, 'page': i.page, 'output': 'json'}) serp = r.json return render().serp(query=i.q, p=i.p, serp=serp, page=i.page, rows=i.rows, zeroclick=zeroclick)
def POST(self): """Organize/sort the comments according to votes, author, time, etc (heuristic) POST route to add a comment to a paper side effects: - handles votes / karma """ i = web.input(pid=None, cid=None, comment="", opt="", enabled=True) option = i.pop('opt') try: # getting the requested paper i.pid = int(i.pid) paper = Paper(i.pid) except (TypeError, IndexError): # TODO: Log # IndexEror("No such paper") or # TypeError("int() arg must be str or number, not 'NoneType'") raise web.notfound() if not i.comment: return render().item(paper) if not session().logged: raise web.seeother('/login?redir=/item?pid=%s' % i.pid) else: i.username = session()['uname'] if option == "edit": try: paper.edit_comment(i.cid, content=i.comment, enabled=i.enabled) except (TypeError, ValueError) as e: # XXX Log error e return render().item(paper) else: i.cid = paper.add_comment(i.cid, session()['uname'], content=i.comment, votes=paper.votes, enabled=i.enabled) record_comment(session()['uname'], i.pid, i.cid) return render().item(paper)
def POST(self): i = web.input(username='', passwd='', redir='/') if session().logged: raise web.seeother(i.redir) if not Academic.validates(i.username, i.passwd): return render().auth.login(err=AUTH_ERR['malformed_creds']) # attempting login first if login(i.username, i.passwd): raise web.seeother(i.redir) try: u = Academic.register(i.username, i.passwd, **Academic.defaults()) u.login() raise web.seeother(i.redir) except Academic.RegistrationException as e: err = AUTH_ERR[str(e.message)] return render().auth.register(err=err)
def GET(self): i = web.input(pid=None, cid=None) if i.pid: i.pid = int(i.pid) try: db = Db('db/openjournal') papers = db.get('papers') paper = papers[i.pid] if i.cid: i.cid = int(i.cid) # XXX Revise data storage scheme s.t. comment can # be retrieved by cid pkey, not i.cid'th index (below) # reason: cnnt can be deleted and lead to consistency # errors (id would then reference wrong entity) comment = paper['comments'][i.cid] return render().comment(i.pid, i.cid, comment) return render().item(i.pid, paper) except IndexError: return "No such item exists, id out of range" raise web.seeother('/')
def POST(self): i = web.input(to="", cc="", bcc="", subject="", tags="", message="") if not getattr(session(), 'passwd', None): raise web.seeother('/login') resp = "success" try: if 'passwd' in session() and session().passwd: tags = [str('#%s' % tag.strip()) if tag[0] != '#' else str(tag.strip()) \ for tag in i.tags.split(',')] message = unescape_html("%s %s" % (i.message, tags) if tags else i.message) mailman = Mailman(session()['email'], session()['passwd']) mailman.sendmail(sender=session().email, subject=i.subject, recipients=[i.to], msg=message, fmt="html") else: raise Exception("Email not sent, account credentials " \ "could not be verified.") except Exception as e: return e resp = "failure" raise web.seeother(web.ctx.homedomain + '?response=' + resp)
def POST(self): i = web.input(q='', cat='', p='0', rows=50, page=1) serp = "<p>No Results Found</p>" zeroclick = [] if i.p == '0': if i.q: urls = findurls(i.q) if urls: zeroclick += [(timeline(url), url) for url in urls] # Fallback to seach all mediatypes if i.q: r = requests.post('http://archive.org/advancedsearch.php', data={'q': i.q.replace('http://', ''), 'rows': i.rows, 'page': i.page, 'output': 'json'}) serp = r.json() return render().serp(query=i.q, p=i.p, serp=serp, page=i.page, rows=i.rows, zeroclick=zeroclick)
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) """ i = web.input(pid=None, sort="popular") if not session().logged: raise web.seeother('/register') if i.pid: i.pid = int(i.pid) u = Academic(session()['uname']) p = Paper(i.pid) if canvote(u, i.pid): try: # move set_vote to paper api p.votes += 1 p.save() record_vote(u['username'], p.submitter, i.pid) except IndexError: return "No such items exists to vote on" raise web.seeother('/?sort=%s' % i.sort)
def GET(self): i = web.input(p='0', q='', rows=50, page=1) if i.q: return self.POST() return render().index(p=int(i.p))
def GET(self): """Invalidate session, etc""" i = web.input(redir='/') Academic.logout() raise web.seeother(i.redir)