Пример #1
0
def domain_owner(domain):
    if domain == settings.domain:
        return User.from_data(None, None)

    if domain.endswith(settings.domain):
        return User('login', domain[0:domain.find(settings.domain) - 1])

    res = db.fetchone("SELECT id FROM users.domains WHERE domain=%s;",
                      [domain])  #, _cache=600)
    if res:
        return User(res[0])

    raise UserNotFound
Пример #2
0
def blog_by_id(uid=None):
    """Obtain user blog contents by given user id
    parameters:
    uid - user id
    """
    if uid:
        env.owner = User(int(uid))
    elif env.user.is_authorized():
        env.owner = env.user

    if not env.owner:
        raise UserNotFound

    before = env.request.args("before")
    if before:
        try:
            before = long(before)
        except ValueError:
            before = None

    try:
        plist = posts.recent_blog_posts(env.owner,
                                        settings.page_limit + 1,
                                        before=before)
        if len(plist) > settings.page_limit:
            plist = plist[:settings.page_limit]
            has_next = True
        else:
            has_next = False
    except PostAuthorError:
        raise Forbidden

    return {"posts": plist, "has_next": has_next}
Пример #3
0
def subscribers_byid(uid):
    """Return user's subscribers by given user id"""
    uid = int(uid)
    env.owner = User(int(uid))
    if not env.owner or not env.owner.id:
        raise NotFound
    return env.owner.subscribers()
Пример #4
0
def usercss(login):
    try:
        u = User('login', login)
    except UserNotFound:
        raise NotFound
    css = u.get_profile('www.usercss')
    return Response(css, mimetype='text/css')
Пример #5
0
def blog(login=None):
    if login:
        env.owner = User("login", login)
    elif env.user.is_authorized():
        env.owner = env.user

    if not env.owner:
        raise UserNotFound

    before = env.request.args("before")
    if before:
        try:
            before = long(before)
        except (TypeError, ValueError):
            before = None

    try:
        plist = posts.recent_blog_posts(env.owner,
                                        settings.page_limit + 1,
                                        before=before)
        if len(plist) > settings.page_limit:
            plist = plist[:settings.page_limit]
            has_next = True
        else:
            has_next = False
    except PostAuthorError:
        raise Forbidden

    return {"posts": plist, "has_next": has_next}
Пример #6
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')
Пример #7
0
def info(login):
    try:
        user = User('login', login)
    except UserNotFound:
        raise NotFound

    try:
        data = users.info(user)
    except SubscribeError:
        raise Forbidden
    data['id'] = user.id
    data['login'] = user.login
    try:
        data['created'] = data['created']
    except (KeyError, AttributeError):
        pass
    try:
        data['birthdate'] = 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 data
Пример #8
0
def taglist(login):
    """Получение спика тегов пользователя по его user id или логину. Параметр 
    login, переданный в URL может быть как числом, и тогда интерпретируется 
    как id пользователя, так и строкой -- в этом случае он интерпретируется 
    как login пользователя
    """
    if login and login.isdigit():
        env.owner = User(int(login))
    else:
        env.owner = User("login", login)
    if not env.owner or not env.owner.id:
        raise UserNotFound

    return map(lambda t: {
        "tag": t["tag"],
        "count": t["cnt"]
    }, env.owner.tags(sort_by_name=True))
Пример #9
0
def register(login, **kwargs):
    """Register a new user
    """
    if env.user.is_authorized():
        raise AlreadyAuthorized(env.user.login)

    try:
        if User('login', login):
            raise UserExists(login)
    except UserNotFound:
        pass

    env.user = env.user.__class__.from_data(None, login, **kwargs)
    env.user.save()

    add_post('User @%s is registered' % login,
             author=User('login', 'welcome'), auto_subscribe=False)
Пример #10
0
def userinfo(login):
    env.owner = User('login', login)
    if env.user.is_authorized() and env.user == env.owner:
        menu = 'blog'
    else:
        menu = ''

    return Response(template='/pages/userinfo.html', menu=menu, owner=env.owner)
Пример #11
0
    def _auth(self, sessid, ws):
        sess = Session(sessid.strip())
        user = User(sess['id'])

        if user.id not in wss:
            wss[user.id] = []
        wss[user.id].append(ws)

        return user
Пример #12
0
def tag_posts(login=None):
    """Выборка постов по тегам пользователя. Пользователь может быть 
    идентифицирован по его user id или логину. 
    Параметр login, переданный в URL может быть числом, и тогда 
    интерпретируется как id пользователя, или строкой -- в этом случае он 
    интерпретируется как login пользователя
    """
    before = env.request.args("before")
    if before:
        try:
            before = long(before)
        except ValueError:
            before = None

    if login:
        if login and login.isdigit():
            author = User(int(login))
        else:
            author = User("login", login)
    else:
        author = None

    if author and author == env.user:
        private = None
    else:
        private = False

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

    plist = posts.select_posts(author=author,
                               private=private,
                               tags=tags,
                               limit=settings.page_limit + 1,
                               before=before)
    if len(plist) > settings.page_limit:
        plist = plist[:settings.page_limit]
        has_next = True
    else:
        has_next = False

    return {"posts": plist, "has_next": has_next}
Пример #13
0
 def handleMatch(self, m):
     try:
         User('login', m.group('u'))
     except UserNotFound:
         return  #'@'+m.group('u')
     a = etree.Element('a')
     a.set('href', userlink(m.group('u')))
     a.set('class', 'user js-navigate')
     a.text = m.group('u')
     return a
Пример #14
0
 def handleMatch(self, m):
     try:
         User('login', m.group('u'))
     except UserNotFound:
         return  #m.group(0)
     a = etree.Element('a')
     a.set('href', link_template % '@' + m.group('u'))
     a.set('style', 'color:#4488ff;font-weight:bold;text-decoration:none;')
     a.text = '@' + m.group('u')
     return a
Пример #15
0
def del_from_blacklist(login):
    if isinstance(login, User):
        user = login
    else:
        user = User('login', login)

    if env.user.id == user.id:
        return

    return env.user.del_from_blacklist(user)
Пример #16
0
 def handleMatch(self, m):
     try:
         User('login', m.group('u'))
     except UserNotFound:
         return #'@'+m.group('u')
     a = etree.Element('a')
     a.set('href', '//%s.%s/' % (m.group('u'), settings.domain))
     a.set('class', 'user')
     a.text = m.group('u')
     return a
Пример #17
0
def unsubscribe_rec(login):
    if isinstance(login, User):
        user = login
    else:
        user = User('login', login)

    if not user.check_subscriber(env.user):
        return False

    user.del_rec_subscriber(env.user)
Пример #18
0
def info(user):
    """Get user info
    """
    if isinstance(user, (str, unicode)):
        user = User('login', user)

    if env.user.id != user.id and user.get_profile('private') \
            and not user.check_whitelist(env.user):
        raise SubscribeError

    return user.get_info()
Пример #19
0
def user_info_byid(uid):
    """Return user info by given user id"""
    if uid and uid.isdigit():
        try:
            user = User(int(uid))
        except (UserNotFound, ValueError):
            raise NotFound
        else:
            data = info(user.login)
            return json.loads(data.body)
    raise NotFound
Пример #20
0
def tag_posts(tag, login=None, show=None, offset=None, limit=None):
    if offset:
        offset = int(offset)
    if limit:
        limit = int(limit)
    else:
        limit = 10

    try:
        author = User('login', login) if login else None
    except UserNotFound, e:
        return xmpp_template('user_not_found', login=e.message)
Пример #21
0
def avatar(login, size):
    """To avoid code duplication, parameter ``login`` can be interpreted 
    as a number if it is user id, and as a string if it is user login"""
    size = int(size) if size else 40
    try:
        if login and login.isdigit():
            user = User(int(login))
        else:
            user = User('login', login)
        avatar = user.get_info('avatar')
    except UserNotFound:
        avatar = None

    if avatar:
        path = '%s%s/%s/%s' % \
               (env.request.protocol, settings.avatars_root, size, avatar)
    else:
        path = '%s%s/av%s.png' % \
               (env.request.protocol, settings.avatars_root, size)

    return Response(redirect=path)
Пример #22
0
def add_to_blacklist(login):
    if isinstance(login, User):
        user = login
    else:
        user = User('login', login)

    if env.user.id == user.id:
        raise SubscribeError

    res = env.user.add_to_blacklist(user)

    # TODO: send to pubsub
    return res
Пример #23
0
def reset_password(code, password):
    redis = RedisPool(settings.storage_socket)
    key = 'reset-password:%s' % code
    print key
    id = redis.get(key)
    if not id:
        raise UserNotFound
    try:
        user = User(int(id))
    except ValueError:
        raise UserNotFound
    user.set_password(password)
    user.save()
    redis.delete(key)
    return user
Пример #24
0
def add_to_whitelist(login):
    if isinstance(login, User):
        user = login
    else:
        user = User('login', login)

    if env.user.id == user.id:
        raise SubscribeError

    res = env.user.add_to_whitelist(user)

    if res:
        publish('sub', {'to': user.id, 'a': 'wl', 'from': env.user.login})

    return res
Пример #25
0
def blog(login, page=1):
    env.owner = User('login', login)

    try:
        plist, page, has_next = get_posts(posts.recent_blog_posts, page, env.owner)
    except PostAuthorError:
        raise BlogForbidden

    if env.user.is_authorized() and env.user == env.owner:
        menu = 'blog'
    else:
        menu = ''

    return Response(template='/pages/blog.html', menu=menu, owner=env.owner,
                    posts=plist, page=page, has_next=has_next)
Пример #26
0
    def handle_post(self, data):
        """Handle post
        """
        if data['private']:
            return

        if len(data['tags']) == 0 or 'point' not in data['tags']:
            return

        tagset = set(data['tags'])

        if tagset & FR_TAGS:
            issue_type = 'enhancement'
        elif tagset & BUG_TAGS:
            issue_type = 'bug'
        else:
            return

        if cache_get('issue-post:%s' % data['post_id']):
            return

        text = template('report.md', **data)

        args = {
            'kind': issue_type,
            'title': data['text'][:100],
            'content': text,
        }

        bb = Bitbucket(settings.api_login, settings.api_password,
                       settings.api_slug)

        issue = Issue(bb)
        status, resp = issue.create(**args)

        try:
            env.user = User('login', 'support')
        except UserNotFound:
            return

        reply = template('reply.txt', issue=resp['local_id'])

        try:
            add_comment(data['post_id'], None, text=reply,
                        dont_subscribe=True, force=True)
        except (PostError, CommentError), e:
            log.error(e)
            return
Пример #27
0
def subscribe_rec(login):
    """Subscribe to user's recommendations
       returns True if subscribed, and False if subscription request is sent
    """
    if isinstance(login, User):
        user = login
    else:
        user = User('login', login)

    if env.user.id == user.id:
        raise SubscribeError

    if not user.check_subscriber(env.user):
        return subscribe(user)

    user.add_rec_subscriber(env.user)
    return True
Пример #28
0
def unsubscribe(login):
    """Unsubscribe from user
    """
    if isinstance(login, User):
        user = login
    else:
        user = User('login', login)

    if env.user.id == user.id:
        raise SubscribeError

    retval = env.user.unsubscribe(user)
    if not retval:
        return False

    # TODO: send to pubsub
    return True
Пример #29
0
def remember():
    if env.request.method != 'POST':
        if env.request.args('sent'):
            return render('/auth/remember-sent.html')
        if env.request.args('fail'):
            return render('/auth/remember-fail.html')
        return render('/auth/remember.html')

    errors = []

    if env.user.id:
        user = env.user
    else:
        login = env.request.args('login')
        if not login:
            errors.append('login')
        else:
            try:
                user = User('login', login)
            except UserNotFound:
                errors.append('login')

    if 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 resp.is_valid:
                users.request_password(user)
                return Response(redirect='%s://%s/remember?sent=1' % \
                        (env.request.protocol, settings.domain))

            errors.append('captcha')

        except urllib2.URLError:
            errors.append('recaptcha-fail')
        except AddressNotFound:
            return Response(redirect='%s://%s/remember?fail=1' % \
                        (env.request.protocol, settings.domain))

    return render('/auth/remember.html', errors=errors)
Пример #30
0
def del_from_blacklist(taglist, login=None):
    if login:
        user = User('login', login)
        uid = user.id
    else:
        uid = None

    if not isinstance(taglist, (list, tuple)):
        taglist = [taglist]
    if uid:
        db.perform(
            "DELETE FROM posts.tags_blacklist "
            "WHERE user_id=%s AND to_user_id=%s "
            "AND tag=ANY(%s);", [env.user.id, uid, taglist])
    else:
        db.perform(
            "DELETE FROM posts.tags_blacklist "
            "WHERE user_id=%s AND to_user_id IS NULL "
            "AND tag=ANY(%s);", [env.user.id, taglist])