def lost_password_post(): form = EmailForm(request.forms) if form.validate(): user = User.objects(email=form.email.data).first() send_reset_password_email(app.config, user.email) return redirect('/reset_password_email_sent') return {'form': form}
def send_confirm_email(config, user_email): token = generate_confirmation_token(config, user_email) user = User.objects(email=user_email).first() content = CONFIRMATION_CONTENT % (user.username, config['DOMAIN'], token, config['DOMAIN'], token) send_email.delay(get_email_config(config), user_email, CONFIRMATION_SUBJECT, content)
def validate_username(self, field): if current_user.is_authenticated and current_user.user.username == field.data: return True user = User.objects(username=field.data).first() if user: raise ValidationError(u'用户名已被使用')
def validate_email(self, field): if session['email']: if session['email'] != field.data: raise ValidationError(u'不能修改第三方登录的email地址') user = User.objects(email=field.data).first() if user: raise ValidationError(u'Email地址已被使用')
def reset_password_get(token): email = validate_token(app.config, token) if email: user = User.objects(email=email).first() if user: return {'form': PasswordForm(), 'token': token} abort(404)
def send_email(): form = EmailForm() if form.validate_on_submit(): user = User.objects(email=form.email.data).first() send_confirm_email(current_app.config, user.email) return redirect('/success_sendmail') return render_template('sendmail.html', form=form)
def send_mail_post(): form = EmailForm(request.forms) if form.validate(): user = User.objects(email=form.email.data).first() send_confirm_email(app.config, user.email) return redirect('/success_sendmail') return {'form': form}
def create_paste(): if request.method == 'GET': # missing csrf form = PasteForm(data={'codes': [{'title': '', 'content': ''}]}) return render_template('pastes/create.html', form=form) else: form = PasteForm(request.form) if form.validate(): user = current_user.user paste = save_paste_and_codes(form) if not paste.is_private: followers = User.objects(followings=user) content = NEW_PASTE.format(user_username=user.username, user_url=url_for('user_app.view', username=user.username), paste_title=paste.title, paste_url=url_for('paste_app.view_paste', hash_id=paste.hash_id)) for follower in followers: message = Message(user=follower, who=user, content=content) message.save() return jsonify(success=True, hash_id=paste.hash_id) else: errors = form.errors errors['codes'] = [code.errors for code in form.codes] logger.info('Failed saving paste for reason: %s', errors) return jsonify(success=False, errors=errors)
def send_reset_password_email(config, user_email): token = generate_confirmation_token(config, user_email) user = User.objects(email=user_email).first() content = RESET_PASSWORD_CONTENT % (user.username, config['DOMAIN'], token, config['DOMAIN'], token) send_email.delay(get_email_config(config), user_email, RESET_PASSWORD_SUBJECT, content)
def get_pastes_from_search(p=1): query_string = request.query.q def get_string_by_keyword(keyword, query_string): string = '' result = re.search('\s*%s:([a-zA-Z+-_#]+)\s*' % keyword, query_string) if result: if len(result.groups()) == 1: string = result.groups()[0] query_string = query_string.replace('%s:%s' % (keyword, string), '') return string, query_string tag, query_string = get_string_by_keyword('tag', query_string) user, query_string = get_string_by_keyword('user', query_string) keyword = query_string.strip() criteria = {'title__contains': keyword, 'is_private': False} if tag: criteria['tags'] = tag if user: user_object = User.objects(username=user).first() criteria['user'] = user_object return keyword, Paste.objects( **criteria).order_by('-updated_at')[(p - 1) * ITEMS_PER_PAGE:p * ITEMS_PER_PAGE]
def create_paste(): if request.method == 'GET': # missing csrf form = PasteForm( data={'codes': [{ 'title': '', 'content': '', 'syntax': 'text' }]}) return render_template('pastes/create.html', form=form) else: form = PasteForm.from_json(data=request.json) if form.validate(): user = current_user.user paste = save_paste_and_codes(form) if not paste.is_private: followers = User.objects(followings=user) content = NEW_PASTE.format( user_username=user.username, user_url=url_for('user_app.view', username=user.username), paste_title=paste.title, paste_url=url_for('paste_app.view_paste', hash_id=paste.hash_id)) for follower in followers: message = Message(user=follower, who=user, content=content) message.save() return jsonify(success=True, hash_id=paste.hash_id) else: errors = form.errors errors['codes'] = [code.errors for code in form.codes] logger.info('Failed saving paste for reason: %s', errors) return jsonify(success=False, errors=errors)
def unwatch_user(username): following_user = User.objects(username=username).first_or_404() if current_user.user.is_following(following_user): current_user.user.followings.remove(following_user) current_user.user.save() return jsonify(watchedStatus=current_user.user.is_following(following_user))
def unwatch_user(username): be_followed_user = User.objects(username=username).first_or_404() if be_followed_user.is_followed_by(current_user.user): be_followed_user.followers.remove(current_user.user) be_followed_user.save() return jsonify(watchedStatus=be_followed_user.is_followed_by(current_user.user))
def view_followers(username): page = get_page() user = User.objects.get_or_404(username=username) pagination = User.objects(followings=user).paginate(page, per_page=20) return render_template('users/followers.html', user=user, pagination=pagination)
def view_bookmarks(username): page = get_page() user = User.objects(username=username).get_or_404() pagination = Bookmark.objects(user=user).order_by('-updated_at').paginate(page, per_page=20) return render_template('bookmarks/index.html', pagination=pagination)
def view_bookmarks(username): page = get_page() user = User.objects(username=username).get_or_404() pagination = Bookmark.objects(user=user).order_by('-updated_at').paginate( page, per_page=20) return render_template('bookmarks/index.html', pagination=pagination)
def lost_password_get(): if request.method == 'GET': return render_template('users/lost_password.html', form=EmailForm()) else: form = EmailForm(request.form) if form.validate(): user = User.objects(email=form.email.data).first() send_reset_password_email(current_app.config, user.email) return redirect('/reset_password_email_sent') return render_template('users/lost_password.html', form=form)
def index(): page = get_page() pagination = Paste.objects(is_private=False).order_by('-updated_at').paginate(page=page, per_page=20) print datetime.today() return render_template('index.html', pagination=pagination, hot_pastes=Paste.objects(is_private=False).order_by('-views')[:10], pastes_count=Paste.objects().count(), comments_count=Comment.objects().count(), users_count=User.objects().count(), syntax_count=Syntax.objects().count(), bookmarks_count=Bookmark.objects().count(), users_increased=User.objects(created_at__gt=date.today()).count(), pastes_increased=Paste.objects(created_at__gt=date.today()).count(), comments_increased=Comment.objects(created_at__gt=date.today()).count(), bookmarks_increased=Bookmark.objects(created_at__gt=date.today()).count(), tags=Tag.objects().order_by('-popularity')[:10])
def validate_email(self, field): if current_user.is_authenticated: field.data = current_user.user.email return True if session['email']: if session['email'] != field.data: raise ValidationError(u'不能修改第三方登录的email地址') user = User.objects(email=field.data).first() if user: raise ValidationError(u'Email地址已被使用')
def validate(self): if not Form.validate(self): return False user = User.objects(email=self.email.data).first() if not user: self.email.errors.append(u'用户不存在') return False return True
def reset_password_post(token): email = validate_token(app.config, token) if email: user = User.objects(email=email).first() if user: form = PasswordForm(request.forms) if form.validate(): user.password = user.generate_password(form.password.data) user.save() redirect('/reset_password_success') return {'form': PasswordForm(), 'token': token} abort(404)
def lost_password_get(): if request.method == 'GET': return render_template('user/lost_password.html', form=EmailForm()) else: form = EmailForm(request.forms) if form.validate(): user = User.objects(email=form.email.data).first() send_reset_password_email(current_app.config, user.email) return redirect('/reset_password_email_sent') return render_template('user/lost_password.html', form=form)
def validate(self): if not Form.validate(self): return False user = User.objects(email=self.email.data).first() if user: if user.check_login(self.password.data): self.user = user return True self.password.errors.append(u'登录邮箱或者密码不正确') return False
def confirm_email(token): email = validate_token(app.config, token) if email: user = User.objects(email=email).first() if user: if (request.user is not None and user == request.user) or request.user is None: if user.is_email_confirmed: return {'title': u"Email已经激活过了", 'message': u"对不起,您的email已经激活过了。"} else: user.is_email_confirmed = True user.email_confirmed_on = datetime.datetime.now() user.save() return {'title': u'Email已经激活', 'message': u'您的email已经激活,请点击登录查看最新代码段。'} return {'title': u'Email验证链接错误', 'message': u'对不起,您的验证链接无效或者已经过期。'}
def oauth_callback(provider): current_app.logger.info("Oauth callback for %s" % provider) redirect_uri = current_app.config['OAUTH'][provider]['callback_url'] oauth_service = get_oauth_services()[provider] data = dict(code=request.args.get('code'), grant_type='authorization_code', redirect_uri=redirect_uri) if provider == 'google': oauth_session = oauth_service.get_auth_session(data=data, decoder=json.loads) user_info = oauth_session.get('userinfo').json() email = session['email'] = user_info['email'] username = user_info['given_name'] elif provider == 'github': oauth_session = oauth_service.get_auth_session(data=data) user_info = oauth_session.get('user').json() email = session['email'] = user_info['email'] username = user_info['login'] access_token = oauth_session.access_token user_info['id'] = str(user_info['id']) current_app.logger.info("%s oauth access token is: %s" % (provider, access_token)) current_app.logger.info("%s oauth user info is %s" % (provider, user_info)) user = User.find_by_oauth(provider, user_info['id']) if user: # TODO: 直接登录时更新 token. user_mixin = LoginManagerUser(user) login_user(user_mixin) flash(u"登录成功", category='info') return redirect('/') else: user = User.objects(email=email).first() if user: user_oauth = UserOauth(provider=provider, openid=user_info['id'], token=access_token) user_oauth.save() user_mixin = LoginManagerUser(user) login_user(user_mixin) flash(u"登录成功", category='info') return redirect('/') else: return render_template('users/finish_signup.html', form=UserInfoForm(email=email, username=username))
def reset_password(token): if request.method == 'GET': email = validate_token(current_app.config, token) if email: user = User.objects(email=email).first() if user: return render_template('users/reset_password.html', form=PasswordForm(), token=token) abort(404) else: email = validate_token(current_app.config, token) if email: user = User.objects(email=email).first() if user: form = PasswordForm(request.form) if form.validate_on_submit(): user.password = user.generate_password(form.password.data) user.save() return redirect('/reset_password_success') return render_template('users/reset_password.html', form=PasswordForm(), token=token) abort(404)
def watch_user(username): following_user = User.objects(username=username).first_or_404() if not current_user.user.is_following(following_user): current_user.user.followings.append(following_user) current_user.user.save() content = WATCH.format(user_username=current_user.user.username, user_url=url_for('user_app.view', username=current_user.user.username)) message = Message(user=following_user, who=current_user.user, content=content) message.save() return jsonify(watchedStatus=current_user.user.is_following(following_user))
def index(): page = get_page() pagination = Paste.objects( is_private=False).order_by('-updated_at').paginate(page=page, per_page=20) print datetime.today() return render_template( 'index.html', pagination=pagination, hot_pastes=Paste.objects(is_private=False).order_by('-views')[:10], pastes_count=Paste.objects().count(), comments_count=Comment.objects().count(), users_count=User.objects().count(), syntax_count=Syntax.objects().count(), bookmarks_count=Bookmark.objects().count(), users_increased=User.objects(created_at__gt=date.today()).count(), pastes_increased=Paste.objects(created_at__gt=date.today()).count(), comments_increased=Comment.objects( created_at__gt=date.today()).count(), bookmarks_increased=Bookmark.objects( created_at__gt=date.today()).count(), tags=Tag.objects().order_by('-popularity')[:10])
def confirm_email(token): email = validate_token(current_app.config, token) if email: user = User.objects(email=email).first_or_404() if (current_user.is_authenticated and user == current_user.user) or not current_user.is_authenticated: if user.is_email_confirmed: return render_template('email/confirm.html', title=u"Email已经激活过了", message=u"对不起,您的email已经激活过了。") else: user.is_email_confirmed = True user.email_confirmed_on = datetime.datetime.now() user.save() return render_template('email/confirm.html', title=u'Email已经激活', message=u'您的email已经激活,请点击登录查看最新代码段。') return render_template('email/confirm.html', title=u'Email验证链接错误', message=u'对不起,您的验证链接无效或者已经过期。')
def reset_password(token): if request.method == 'GET': email = validate_token(current_app.config, token) if email: user = User.objects(email=email).first() if user: return render_template('user/reset_password.html', form=PasswordForm(), token=token) abort(404) else: email = validate_token(current_app.config, token) if email: user = User.objects(email=email).first() if user: form = PasswordForm() if form.validate_on_submit(): user.password = user.generate_password(form.password.data) user.save() return redirect('/reset_password_success') return render_template('user/reset_password.html', form=PasswordForm(), token=token) abort(404)
def oauth_callback(provider): logger.info("Oauth callback for %s" % provider) redirect_uri = app.config['oauth.%s.callback_url' % provider] oauth_service = oauth_services[provider] session = get_session(request) data = dict(code=request.params.get('code'), grant_type='authorization_code', redirect_uri=redirect_uri) if provider == 'google': oauth_session = oauth_service.get_auth_session(data=data, decoder=json.loads) user_info = oauth_session.get('userinfo').json() email = session['email'] = user_info['email'] username = user_info['given_name'] elif provider == 'github': oauth_session = oauth_service.get_auth_session(data=data) user_info = oauth_session.get('user').json() email = session['email'] = user_info['email'] username = user_info['login'] access_token = oauth_session.access_token user_info['id'] = str(user_info['id']) logger.info("%s oauth access token is: %s" % (provider, access_token)) logger.info("%s oauth user info is %s" % (provider, user_info)) user = User.find_by_oauth(provider, user_info['id']) if user: # TODO: 直接登录时更新 token. login.login_user(str(user.id)) return redirect('/') else: user = User.objects(email=email).first() if user: user_oauth = UserOauth(provider=provider, openid=user_info['id'], token=access_token) user_oauth.save() login.login_user(str(user.id)) return redirect('/') else: return { 'form': UserInfoForm(email=email, username=username), 'token': request.csrf_token }
def create_paste(): if request.method == 'GET': # missing csrf form = PasteForm(data={'codes': [{'title': '', 'content': ''}]}) return render_template('pastes/create.html', form=form) else: form = PasteForm(request.form) if form.validate(): user = current_user.user paste = save_paste_and_codes(form) followers = User.objects(followers=user) for follower in followers: create_message(follower, paste) return jsonify(success=True, hash_id=paste.hash_id) else: errors = form.errors errors['codes'] = [code.errors for code in form.codes] logger.info('Failed saving paste for reason: %s', errors) return jsonify(success=False, errors=errors)
def oauth_callback(provider): logger.info("Oauth callback for %s" % provider) redirect_uri = app.config['oauth.%s.callback_url' % provider] oauth_service = oauth_services[provider] session = get_session(request) data = dict(code=request.params.get('code'), grant_type='authorization_code', redirect_uri=redirect_uri) if provider == 'google': oauth_session = oauth_service.get_auth_session(data=data, decoder=json.loads) user_info = oauth_session.get('userinfo').json() email = session['email'] = user_info['email'] username = user_info['given_name'] elif provider == 'github': oauth_session = oauth_service.get_auth_session(data=data) user_info = oauth_session.get('user').json() email = session['email'] = user_info['email'] username = user_info['login'] access_token = oauth_session.access_token user_info['id'] = str(user_info['id']) logger.info("%s oauth access token is: %s" % (provider, access_token)) logger.info("%s oauth user info is %s" % (provider, user_info)) user = User.find_by_oauth(provider, user_info['id']) if user: # TODO: 直接登录时更新 token. login.login_user(str(user.id)) return redirect('/') else: user = User.objects(email=email).first() if user: user_oauth = UserOauth(provider=provider, openid=user_info['id'], token=access_token) user_oauth.save() login.login_user(str(user.id)) return redirect('/') else: return {'form': UserInfoForm(email=email, username=username), 'token': request.csrf_token}
def confirm_email(token): email = validate_token(app.config, token) if email: user = User.objects(email=email).first() if user: if (request.user is not None and user == request.user) or request.user is None: if user.is_email_confirmed: return { 'title': u"Email已经激活过了", 'message': u"对不起,您的email已经激活过了。" } else: user.is_email_confirmed = True user.email_confirmed_on = datetime.datetime.now() user.save() return { 'title': u'Email已经激活', 'message': u'您的email已经激活,请点击登录查看最新代码段。' } return {'title': u'Email验证链接错误', 'message': u'对不起,您的验证链接无效或者已经过期。'}
def get_pastes_from_search(query_string, p=1): def get_string_by_keyword(keyword, query_string): string = '' result = re.search('\s*%s:([a-zA-Z+-_#]+)\s*' % keyword, query_string) if result: if len(result.groups()) == 1: string = result.groups()[0] return string, query_string.replace('%s:%s' % (keyword, string), '') tag, query_string = get_string_by_keyword('tag', query_string) user, query_string = get_string_by_keyword('user', query_string) keyword = query_string.strip() criteria = {'title__contains': keyword, 'is_private': False} if tag: criteria['tags'] = tag if user: user_object = User.objects(username=user).first() if user_object: criteria['user'] = user_object return keyword, Paste.objects(**criteria).order_by('-updated_at').paginate(p, per_page=2)
def status(): return {'pastes_count': Paste.objects().count(), 'codes_count': Code.objects().count(), 'users_count': User.objects().count()}
def status(): return jsonify(version=current_app.config['VERSION'], pastes=Paste.objects().count(), bookmarks=Bookmark.objects().count(), tags=Tag.objects().count(), users=User.objects().count())
def validate_username(self, field): user = User.objects(username=field.data).first() if user: raise ValidationError(u'用户名已被使用')
def send_confirm_email(config, user_email): token = generate_confirmation_token(config, user_email) user = User.objects(email=user_email).first() content = CONFIRMATION_CONTENT % (user.username, config['site.domain'], token, config['site.domain'], token) send_email(config, user_email, CONFIRMATION_SUBJECT, content)
def validate_email(self, field): user = User.objects(email=field.data).first() if user is not None: raise ValidationError(u'Email已被使用')