예제 #1
0
파일: users.py 프로젝트: radjah/point-www
def info(login):
    try:
        user = User('login', login)
    except UserNotFound:
        raise NotFound

    try:
        data = users.info(user)
    except SubscribeError:
        raise Forbidden
    data['login'] = login
    try:
        data['created'] = timestamp(data['created'])
    except (KeyError, AttributeError):
        pass
    try:
        data['birthdate'] = timestamp(data['birthdate'])
    except (KeyError, AttributeError):
        pass
    if env.user.id:
        data['subscribed'] = user.check_subscriber(env.user)
        data['rec_sub'] = user.check_rec_subscriber(env.user)
        if not data['subscribed']:
            data['bl'] = env.user.check_blacklist(user)
            if not data['bl']:
                data['wl'] = env.user.check_blacklist(user)
    return Response(json.dumps(data), mimetype='application/json')
예제 #2
0
def info(login):
    try:
        user = User('login', login)
    except UserNotFound:
        raise NotFound

    try:
        data = users.info(user)
    except SubscribeError:
        raise Forbidden
    data['login'] = login
    try:
        data['created'] = timestamp(data['created'])
    except (KeyError, AttributeError):
        pass
    try:
        data['birthdate'] = timestamp(data['birthdate'])
    except (KeyError, AttributeError):
        pass
    if env.user.id:
        data['subscribed'] = user.check_subscriber(env.user)
        data['rec_sub'] = user.check_rec_subscriber(env.user)
        if not data['subscribed']:
            data['bl'] = env.user.check_blacklist(user)
            if not data['bl']:
                data['wl'] = env.user.check_blacklist(user)
    return Response(json.dumps(data), mimetype='application/json')
예제 #3
0
def messages_new(page=1):
    try:
        page = int(page)
    except (TypeError, ValueError):
        page = 1
    if not page:
        page = 1

    offset = (page - 1) * settings.page_limit

    plist = posts.private_unread(offset=offset, limit=settings.page_limit + 1)

    if not plist and page == 1:
        return Response(redirect='%s://%s/messages/incoming' % \
                        (env.request.protocol, settings.domain))

    if env.request.is_xhr:
        for p in plist:
            p['created'] = timestamp(p['created'])
        return Response(json.dumps(plist), mimetype='application/json')

    return render('/messages/index.html',
                  section='messages',
                  posts=plist,
                  page=page)
예제 #4
0
def comments(page=1, unread=False):
    if not env.owner or env.owner.id != env.user.id:
        return Response(redirect='%s://%s.%s%s' % \
                        (env.request.protocol,
                         env.user.login.lower(), settings.domain,
                         env.request.path))

    try:
        page = int(page)
    except (TypeError, ValueError):
        page = 1
    if not page:
        page = 1

    offset = (page - 1) * settings.page_limit

    plist = posts.recent_commented_posts(unread=unread,
                                         offset=offset,
                                         limit=settings.page_limit + 1)

    if env.request.is_xhr:
        for p in plist:
            p['created'] = timestamp(p['created'])
        return Response(json.dumps(plist), mimetype='application/json')

    return render('/comments.html',
                  section='comments',
                  unread=unread,
                  posts=plist,
                  page=page)
예제 #5
0
파일: blog.py 프로젝트: radjah/point-www
def recent_all(page=1, unread=False):
    if not env.owner or env.owner.id != env.user.id:
        return Response(redirect="%s://%s.%s/recent" % \
                        (env.request.protocol, env.user.login, settings.domain))
    try:
        page = int(page)
    except (TypeError, ValueError):
        page = 1
    if not page:
        page = 1

    offset = (page - 1) * settings.page_limit

    unread = bool(unread)

    plist = posts.recent_posts(unread=unread,
                               offset=offset, limit=settings.page_limit+1)

    if env.request.is_xhr:
        for p in plist:
            p['created'] = timestamp(p['created'])
        return Response(json.dumps(plist), mimetype='application/json')

    return render('/recent.html', section='recent_all', unread=unread,
                  posts=plist, page=page)
예제 #6
0
    def posts(self, limit=None):
        posts = []
        lp = self.last_published()

        for p in self._posts:
            try:
                if self.id and lp and p.created <= lp:
                    continue
            except TypeError:
                log.error('-- created "%s" <> lp "%s"' % (p.created, lp))
                raise FeedFetchError

            posts.append(p)

        posts.sort(lambda a, b: int(timestamp(a.created) - timestamp(b.created)))

        if limit is not None:
            return posts[-abs(int(limit)):]
        return posts
예제 #7
0
    def update_task(self):
        if not self.id:
            return

        res = db.fetchall(
            "SELECT created FROM posts.posts WHERE author=%s "
            "ORDER BY created DESC LIMIT 10;", [self.id])

        now = datetime.now()

        timestamps = []
        for p in res:
            timestamps.append(timestamp(p['created']))

        if len(timestamps) < 2:
            self.update_at(now +
                           timedelta(seconds=settings.feed_max_update_timeout))
            return

        lp = self.last_published()

        tz = timezone(settings.timezone)
        newlp = tz.localize(datetime.fromtimestamp(int(max(timestamps))))

        if newlp > lp:
            self.last_published(newlp)

        timestamps.append(timestamp(now))
        timestamps.sort()
        deltas = []
        for i in xrange(1, len(timestamps)):
            deltas.append(timestamps[i] - timestamps[i - 1])
        delta = reduce(lambda mem, t: mem + t, deltas, 0) / len(deltas) + 60
        if delta < settings.feed_min_update_timeout:
            delta = settings.feed_min_update_timeout
        if delta > settings.feed_max_update_timeout:
            delta = settings.feed_max_update_timeout
        update_at = now + timedelta(seconds=delta)

        self.update_at(update_at)

        del timestamps
예제 #8
0
    def posts(self, limit=None):
        posts = []
        lp = self.last_published()

        for p in self._posts:
            try:
                if self.id and lp and p.created <= lp:
                    continue
            except TypeError:
                log.error('-- created "%s" <> lp "%s"' % (p.created, lp))
                raise FeedFetchError

            posts.append(p)

        posts.sort(
            lambda a, b: int(timestamp(a.created) - timestamp(b.created)))

        if limit is not None:
            return posts[-abs(int(limit)):]
        return posts
예제 #9
0
    def update_task(self):
        if not self.id:
            return

        res = db.fetchall("SELECT created FROM posts.posts WHERE author=%s "
                          "ORDER BY created DESC LIMIT 10;", [self.id])

        now = datetime.now()

        timestamps = []
        for p in res:
            timestamps.append(timestamp(p['created']))

        if len(timestamps) < 2:
            self.update_at(now + timedelta(seconds=settings.feed_max_update_timeout))
            return

        lp = self.last_published()

        tz = timezone(settings.timezone)
        newlp = tz.localize(datetime.fromtimestamp(int(max(timestamps))))

        if newlp > lp:
            self.last_published(newlp)

        timestamps.append(timestamp(now))
        timestamps.sort()
        deltas = []
        for i in xrange(1, len(timestamps)):
            deltas.append(timestamps[i] - timestamps[i-1])
        delta = reduce(lambda mem, t: mem+t, deltas, 0) / len(deltas) + 60
        if delta < settings.feed_min_update_timeout:
            delta = settings.feed_min_update_timeout
        if delta > settings.feed_max_update_timeout:
            delta = settings.feed_max_update_timeout
        update_at = now + timedelta(seconds=delta)

        self.update_at(update_at)

        del timestamps
예제 #10
0
def tag_posts(tag, page=1):
    if env.request.host != settings.domain and (not env.owner
                                                or not env.owner.id):
        raise UserNotFound

    try:
        page = int(page)
    except (TypeError, ValueError):
        page = 1
    if not page:
        page = 1

    offset = (page - 1) * settings.page_limit

    if env.owner and env.owner.id:
        author = env.owner
    else:
        author = None

    if env.owner and env.owner.id == env.user.id:
        private = None
    else:
        private = False

    # variable deny_anonymous is for corresponding value of 'deny_anonymous'
    # field in 'users.profile' table
    deny_anonymous = False if not env.user.is_authorized() else None

    if not isinstance(tag, (list, tuple)):
        tag = [tag]
    tag = [t.decode('utf-8', 'ignore').replace(u"\xa0", " ") for t in tag]

    plist = posts.select_posts(author=author,
                               private=private,
                               deny_anonymous=deny_anonymous,
                               tags=tag,
                               offset=offset,
                               limit=settings.page_limit + 1)

    if env.request.is_xhr:
        for p in plist:
            p['created'] = timestamp(p['created'])
        return Response(json.dumps(plist), mimetype='application/json')

    section = 'blog' if env.owner and env.user.id == env.owner.id else ''

    return render('/tags.html',
                  section=section,
                  posts=plist,
                  page=page,
                  tags=tag)
예제 #11
0
def messages_outgoing(page=1):
    try:
        page = int(page)
    except (TypeError, ValueError):
        page = 1
    if not page:
        page = 1

    offset = (page - 1) * settings.page_limit

    plist = posts.private_outgoing(offset=offset, limit=settings.page_limit+1)

    if env.request.is_xhr:
        for p in plist:
            p['created'] = timestamp(p['created'])
        return Response(json.dumps(plist), mimetype='application/json')

    return render('/messages/outgoing.html', section='messages/outgoing', posts=plist, page=page)
예제 #12
0
파일: blog.py 프로젝트: radjah/point-www
def messages_outgoing(page=1):
    try:
        page = int(page)
    except (TypeError, ValueError):
        page = 1
    if not page:
        page = 1

    offset = (page - 1) * settings.page_limit

    plist = posts.private_outgoing(offset=offset, limit=settings.page_limit+1)

    if env.request.is_xhr:
        for p in plist:
            p['created'] = timestamp(p['created'])
        return Response(json.dumps(plist), mimetype='application/json')

    return render('/messages/outgoing.html', section='messages/outgoing', posts=plist, page=page)
예제 #13
0
파일: blog.py 프로젝트: radjah/point-www
def tag_posts(tag, page=1):
    if env.request.host != settings.domain and (not env.owner or not env.owner.id):
        raise UserNotFound

    try:
        page = int(page)
    except (TypeError, ValueError):
        page = 1
    if not page:
        page = 1

    offset = (page - 1) * settings.page_limit

    if env.owner and env.owner.id:
        author = env.owner
    else:
        author = None

    if env.owner and env.owner.id == env.user.id:
        private = None
    else:
        private = False

    # variable deny_anonymous is for corresponding value of 'deny_anonymous'
    # field in 'users.profile' table
    deny_anonymous = False if not env.user.is_authorized() else None

    if not isinstance(tag, (list, tuple)):
        tag = [tag]
    tag = [t.decode('utf-8', 'ignore').replace(u"\xa0", " ") for t in tag]

    plist = posts.select_posts(author=author, private=private, 
                               deny_anonymous=deny_anonymous, tags=tag,
                               offset=offset, limit=settings.page_limit+1)

    if env.request.is_xhr:
        for p in plist:
            p['created'] = timestamp(p['created'])
        return Response(json.dumps(plist), mimetype='application/json')

    section = 'blog' if env.owner and env.user.id == env.owner.id else ''

    return render('/tags.html', section=section, posts=plist, page=page,
                  tags=tag)
예제 #14
0
파일: blog.py 프로젝트: radjah/point-www
def blog(page=1):
    try:
        page = int(page)
    except (TypeError, ValueError):
        page = 1
    if not page:
        page = 1

    if not env.owner or not env.owner.id:
        raise UserNotFound

    offset = (page - 1) * settings.page_limit

    plist = posts.recent_blog_posts(env.owner, settings.page_limit+1, offset)

    if env.request.is_xhr:
        for p in plist:
            p['created'] = timestamp(p['created'])
            p['text'] = markdown_filter(None, p['text'])
        return Response(json.dumps(plist), mimetype='application/json')

    return render('/blog.html', section='blog', posts=plist, page=page)
예제 #15
0
파일: blog.py 프로젝트: radjah/point-www
def messages_new(page=1):
    try:
        page = int(page)
    except (TypeError, ValueError):
        page = 1
    if not page:
        page = 1

    offset = (page - 1) * settings.page_limit

    plist = posts.private_unread(offset=offset, limit=settings.page_limit+1)

    if not plist and page == 1:
        return Response(redirect='%s://%s/messages/incoming' % \
                        (env.request.protocol, settings.domain))

    if env.request.is_xhr:
        for p in plist:
            p['created'] = timestamp(p['created'])
        return Response(json.dumps(plist), mimetype='application/json')

    return render('/messages/index.html', section='messages', posts=plist, page=page)
예제 #16
0
def blog(page=1):
    try:
        page = int(page)
    except (TypeError, ValueError):
        page = 1
    if not page:
        page = 1

    if not env.owner or not env.owner.id:
        raise UserNotFound

    offset = (page - 1) * settings.page_limit

    plist = posts.recent_blog_posts(env.owner, settings.page_limit + 1, offset)

    if env.request.is_xhr:
        for p in plist:
            p['created'] = timestamp(p['created'])
            p['text'] = markdown_filter(None, p['text'])
        return Response(json.dumps(plist), mimetype='application/json')

    return render('/blog.html', section='blog', posts=plist, page=page)
예제 #17
0
def register():
    #raise Forbidden
    if env.user.id:
        raise AlreadyAuthorized

    sess = Session()
    info = sess['reg_info'] or {}

    if env.request.method == 'GET':
        try:
            del info['network']
            del info['uid']
        except (KeyError, TypeError):
            pass
        sess['reg_info'] = info
        sess['reg_start'] = timestamp(datetime.now())
        sess.save()

        try:
            info['birthdate'] = parse_date(info['birthdate']) \
                                or datetime.now() - timedelta(days=365*16+4)
        except (KeyError, TypeError):
            info['birthdate'] = None

        return render('/auth/register.html', fields=ULOGIN_FIELDS, info=info)

    if cache_get('reg-ok:%s' % env.request.remote_host):
        raise Forbidden

    hi1 = env.request.args('hi1')
    try:
        hi2 = int(env.request.args('hi2', 0))
    except ValueError:
        hi2 = 0

    #try:
    #    h = hi2 / (timestamp(datetime.now()) - int(sess['reg_start']))
    #except:
    #    raise Forbidden
    #finally:
    #    pass
    if hi2 < 5:
        raise Forbidden

    try:
        network = info['network'] if 'network' in info else None
        uid = info['uid'] if 'uid' in info else None
    except TypeError:
        network = None
        uid = None

    errors = []

    for p in [
            'login', 'name', 'email', 'birthdate', 'location', 'about',
            'homepage'
    ]:
        info[p] = env.request.args(p, '').decode('utf-8')

    info['gender'] = _gender(env.request.args('gender'))

    login = env.request.args('login', '').strip()

    if hi1 != login:
        raise Forbidden

    if login and validate_nickname(login):
        try:
            u = User('login', login)
            if u.id:
                errors.append('login-in-use')
        except UserNotFound:
            pass
    elif login:
        errors.append('login-invalid')
    else:
        errors.append('login-empty')

    password = env.request.args('password')
    confirm = env.request.args('confirm')
    if not (network and uid):
        if not password:
            errors.append('password')
        elif password != confirm:
            errors.append('confirm')

    info['birthdate'] = parse_date(info['birthdate']) \
                            or datetime.now() - timedelta(days=365*16+4)

    if not network and not errors:
        try:
            text = env.request.args('recaptcha_response_field')
            challenge = env.request.args('recaptcha_challenge_field')

            resp = captcha.submit(challenge, text,
                                  settings.recaptcha_private_key,
                                  env.request.remote_host)

            if not resp.is_valid:
                errors.append('captcha')

        except urllib2.URLError, e:
            log.error('recaptcha fail: %s' % e)
            #errors.append('recaptcha-fail')
        except AddressNotFound:
            return Response(redirect='%s://%s/remember?fail=1' % \
                        (env.request.protocol, settings.domain))
예제 #18
0
            return Response(redirect='%s://%s/remember?fail=1' % \
                        (env.request.protocol, settings.domain))

    if not errors:
        try:
            users.register(login)
        except UserExists:
            errors.append('login-in-use')

    if errors:
        if network and uid:
            tmpl = '/auth/register_ulogin.html'
        else:
            tmpl = '/auth/register.html'

        sess['reg_start'] = timestamp(datetime.now())
        sess.save()
        return render(tmpl, fields=ULOGIN_FIELDS, info=info, errors=errors)

    for p in [
            'name', 'email', 'birthdate', 'gender', 'location', 'about',
            'homepage'
    ]:
        env.user.set_info(p, info[p])

    if password:
        env.user.set_password(password)

    if network and uid:
        _nickname = info['_nickname'] if '_nickname' in info else None
        _name = info['_name'] if '_name' in info else None
예제 #19
0
def register():
    #raise Forbidden
    if env.user.id:
        raise AlreadyAuthorized

    sess = Session()
    info = sess['reg_info'] or {}

    if env.request.method == 'GET':
        try:
            del info['network']
            del info['uid']
        except (KeyError, TypeError):
            pass
        sess['reg_info'] = info
        sess['reg_start'] = timestamp(datetime.now())
        sess.save()

        try:
            info['birthdate'] = parse_date(info['birthdate']) \
                                or datetime.now() - timedelta(days=365*16+4)
        except (KeyError, TypeError):
            info['birthdate'] = None

        return render('/auth/register.html', fields=ULOGIN_FIELDS, info=info)

    if cache_get('reg-ok:%s' % env.request.remote_host):
        raise Forbidden

    hi1 = env.request.args('hi1')
    try:
        hi2 = int(env.request.args('hi2', 0))
    except ValueError:
        hi2 = 0

    #try:
    #    h = hi2 / (timestamp(datetime.now()) - int(sess['reg_start']))
    #except:
    #    raise Forbidden
    #finally:
    #    pass
    if hi2 < 5:
        raise Forbidden

    try:
        network = info['network'] if 'network' in info else None
        uid = info['uid'] if 'uid' in info else None
    except TypeError:
        network = None
        uid = None

    errors = []

    for p in ['login', 'name', 'email', 'birthdate', 'location', 'about', 'homepage']:
        info[p] = env.request.args(p, '').decode('utf-8')

    info['gender'] = _gender(env.request.args('gender'))

    login = env.request.args('login', '').strip()

    if hi1 != login:
        raise Forbidden

    if login and validate_nickname(login):
        try:
            u = User('login', login)
            if u.id:
                errors.append('login-in-use')
        except UserNotFound:
            pass
    elif login:
        errors.append('login-invalid')
    else:
        errors.append('login-empty')

    password = env.request.args('password')
    confirm = env.request.args('confirm')
    if not (network and uid):
        if not password:
            errors.append('password')
        elif password != confirm:
            errors.append('confirm')

    info['birthdate'] = parse_date(info['birthdate']) \
                            or datetime.now() - timedelta(days=365*16+4)

    if not network and not errors:
        try:
            text = env.request.args('recaptcha_response_field')
            challenge = env.request.args('recaptcha_challenge_field')

            resp = captcha.submit(challenge, text,
                                  settings.recaptcha_private_key,
                                  env.request.remote_host)

            if not resp.is_valid:
                errors.append('captcha')

        except urllib2.URLError, e:
            log.error('recaptcha fail: %s' % e)
            #errors.append('recaptcha-fail')
        except AddressNotFound:
            return Response(redirect='%s://%s/remember?fail=1' % \
                        (env.request.protocol, settings.domain))
예제 #20
0
            return Response(redirect='%s://%s/remember?fail=1' % \
                        (env.request.protocol, settings.domain))

    if not errors:
        try:
            users.register(login)
        except UserExists:
            errors.append('login-in-use')

    if errors:
        if network and uid:
            tmpl = '/auth/register_ulogin.html'
        else:
            tmpl = '/auth/register.html'

        sess['reg_start'] = timestamp(datetime.now())
        sess.save()
        return render(tmpl, fields=ULOGIN_FIELDS, info=info, errors=errors)

    for p in ['name', 'email', 'birthdate', 'gender', 'location', 'about', 'homepage']:
        env.user.set_info(p, info[p])

    if password:
        env.user.set_password(password)

    if network and uid:
        _nickname = info['_nickname'] if '_nickname' in info else None
        _name = info['_name'] if '_name' in info else None
        _profile = info['_profile'] if '_profile' in info else None
        try:
            env.user.bind_ulogin(network, uid, _nickname, _name, _profile)