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
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}
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()
def usercss(login): try: u = User('login', login) except UserNotFound: raise NotFound css = u.get_profile('www.usercss') return Response(css, mimetype='text/css')
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}
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')
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
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))
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)
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)
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
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}
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
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
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)
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
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)
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()
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
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)
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)
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
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
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
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)
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
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
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
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)
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])