Exemple #1
0
    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')
Exemple #3
0
 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')
Exemple #4
0
 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()
Exemple #5
0
    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('/')
Exemple #6
0
    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')
Exemple #7
0
    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)
Exemple #8
0
    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('/')        
Exemple #9
0
 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
Exemple #10
0
 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')
Exemple #11
0
 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)
Exemple #12
0
 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])
Exemple #13
0
 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)
Exemple #14
0
 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)
Exemple #15
0
 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"
Exemple #16
0
    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')
Exemple #17
0
    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'])
Exemple #18
0
    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'])
Exemple #19
0
    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('/')
Exemple #20
0
 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('/')
Exemple #21
0
 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")
Exemple #22
0
 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")
Exemple #23
0
 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('/')
Exemple #24
0
 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)
Exemple #25
0
 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)
Exemple #26
0
    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"})
Exemple #27
0
 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('/')        
Exemple #28
0
 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)
Exemple #29
0
 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()
Exemple #30
0
    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)
Exemple #31
0
 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)
Exemple #32
0
    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)
Exemple #33
0
    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)
Exemple #34
0
    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)
Exemple #35
0
    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)
Exemple #36
0
 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('/')
Exemple #37
0
    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)
Exemple #38
0
    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)
Exemple #39
0
    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)
Exemple #40
0
 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))
Exemple #41
0
 def GET(self):
     """Invalidate session, etc"""
     i = web.input(redir='/')
     Academic.logout()
     raise web.seeother(i.redir)