def checkout() -> Response: """アイテム購入""" project_id = request.args.get('project') item_id = request.args.get('item') if not project_id: return redirect_(url_for('front.home')) if not item_id: return redirect_(url_for('front.project', project_id=project_id)) if current_user.is_authenticated: project_api = sw.ProjectApi(api_client=g.api) project_ = project_api.projects_project_id_get(project_id=project_id) if not project_.id: # 指定したIDのプロジェクトが存在しない return redirect_(url_for('front.home')) items = get_project_items(project=project_) item = [item for item in items if item_id == str(item.id)] if not item: # 指定したIDのアイテムが存在しない return redirect_(url_for('front.project', project_id=project_id)) questions = project_api.projects_project_id_items_item_id_questions_get( project_id=project_id, item_id=item_id) creator_api = sw.CreatorApi(g.api) creator = creator_api.creators_user_id_get(user_id=project_.user_id) return render_template('checkout.html', project=project_, items=items, creator=creator, questions=questions, item=item[0], form=CheckoutForm()) else: return redirect_(url_for('front.login'))
def password_reset(): reset_form = PasswordResetForm(request.form) creator_api = sw.CreatorApi(g.api) if reset_form.validate_on_submit(): pwd_reset = sw.PasswordReset() pwd_reset.reset_token = reset_form.token.data pwd_reset.password = reset_form.password.data try: result = creator_api.creators_password_put(password_reset=pwd_reset) current_app.logger.info(result) return redirect_(url_for('creator.login')) except ApiException as ex: flash('パスワード再設定URLが有効期限切れです', category='error') current_app.logger.info(ex) if 'token' in request.args: token = request.args['token'] try: result = creator_api.creators_password_get(reset_token=token) current_app.logger.info(result) reset_form.token.data = token return render_template('creator_password_reset.html', form=reset_form) except ApiException as ex: flash('パスワード再設定URLが有効期限切れです', category='error') current_app.logger.info(ex) return redirect_(url_for('creator.password_request'))
def profile_image() -> Response: """プロフィール編集""" image_form = ImageForm(request.form) if image_form.csrf_token.errors: abort(401) if 'image' in request.files and request.files['image']: image = request.files['image'] if image.content_length < 1048577: # 画像は1MB制限 file_name = utils.upload_profile_image_to_tmp(file=image) if file_name: session['profile_image'] = file_name else: flash('画像ファイルを選択してください', category='error') else: flash('アップロード可能な画像サイズは1MBまでです', category='error') elif 'profile_image' in session: if 'width' in request.form and 'height' in request.form \ and 'x' in request.form and 'y' in request.form: crop_size = (int(request.form['x']), int(request.form['y']), (int(request.form['x']) + int(request.form['width'])), (int(request.form['y']) + int(request.form['height']))) file_path = utils.upload_profile_image_to_s3( src_file_name=session['profile_image'], crop_size=crop_size) my_api = sw.MyApi(api_client=g.api) profile_ = my_api.my_profile_get() profile_.image = file_path my_api.my_profile_put(user=profile_) flash('画像をアップロードしました', category='info') else: utils.delete_profile_tmp_image( src_file_name=session['profile_image']) session.pop('profile_image') return redirect_(url_for('front.profile_edit'))
def project_review(project_id): project_api = sw.ProjectApi(api_client=g.api) project_ = sw.Project() project_.is_approval = 0 # (承認ステータス) 3:未申請 -> 0:未承認 -> 1:承認済み project_api.projects_project_id_put(project_id=project_id, project=project_) flash('プロジェクトの審査を開始しました。', category='info') return redirect_(url_for('creator.project', project_id=project_id))
def member_edit(edit_type: str) -> Response: """ ユーザ情報変更(クラブレコチョク) :param edit_type: 変更種別 """ ok_url = urllib.parse.quote( current_app.config.get('WEB_HOST') + '/login?next=/profile/') param = '?service=wizy&devices_type=WEB&ok_url=' silent_url = urllib.parse.quote( current_app.config.get('CLUB_RECOCHOKU_SILENT_RETURN') + param + ok_url) if edit_type == 'password': return redirect( current_app.config.get('CLUB_RECOCHOKU_EDIT_PASS') + param + silent_url) if edit_type == 'profile': return redirect( current_app.config.get('CLUB_RECOCHOKU_EDIT_PROF') + param + silent_url) if edit_type == 'mail': return redirect( current_app.config.get('CLUB_RECOCHOKU_EDIT_MAIL') + param + silent_url) return redirect_(url_for('front.profile_favorite'))
def project(project_id: int): """プロジェクト: 詳細""" project_api = sw.ProjectApi(api_client=g.api) try: project_ = project_api.projects_project_id_get(project_id=project_id) reports_ = project_api.projects_project_id_reports_get(project_id=project_id) return render_template('creator_project.html', project=project_, reports=reports_, form=DeleteForm()) except: return redirect_(url_for('creator.home'))
def project_new(): """プロジェクト: 新規作成""" basic_form = ProjectBasicForm(request.form) if basic_form.validate_on_submit(): project_ = converter.project_form_to_api_project(basic_form) project_api = sw.ProjectApi(g.api) project_ = project_api.projects_post(project_) flash('プロジェクトを登録しました', category='info') return redirect_(url_for('creator.project_edit_basic', project_id=project_.id)) utils.flash_errors(basic_form) return render_template('creator_project_new.html', basic_form=basic_form)
def signup(): """クリエイターの登録画面""" if current_user.is_authenticated: logout_user() if 'token' in session: session.pop('token') return redirect_(url_for('creator.signup')) form = SignupForm(request.form) if request.method == 'POST': if form.validate_on_submit(): user = sw.User() user.nickname = form.username.data user.email = form.email.data user.password = form.password.data try: creator_api = sw.CreatorApi(api_client=g.api) creator_api.creators_post(user=user) return redirect_(url_for('creator.login')) except ApiException as ex: flash('登録済みのメールアドレスです', category='error') current_app.logger.warning(ex) return render_template('creator_signup.html', form=form)
def login() -> Response: """クラブレコチョクからの戻りURL""" if 'enable_id' in request.args: user_agent = request.headers.get('User-Agent') current_app.logger.info('User-Agent: %s' % user_agent) auth = sw.Authenticate() auth.key = 'session_key' auth.secret = request.args['enable_id'] auth.device = check_device(request.user_agent) auth.trid = check_trid(cookies=request.cookies) auth_api = sw.AuthApi(g.api) try: token = auth_api.authenticate_post(authenticate=auth) login_user_(access_token=token.access_token) if 'next' in request.args and 'logout' not in request.args['next']: if 'regist' in request.args: return redirect_(request.args['next'] + '?regist=complete') return redirect_(request.args['next']) if 'regist' in request.args: return redirect_(url_for('front.home') + '?regist=complete') return redirect_(url_for('front.home')) except ApiException as ex: current_app.logger.warning('login error: %s', ex) flash('認証に失敗しました', category='error') return redirect_(url_for('front.home')) if current_user.is_authenticated: return redirect_(url_for('front.home')) """クラブレコチョクへ認証しに行く""" if request.referrer and request.referrer.startswith( current_app.config.get('WEB_HOST')): next_ = request.referrer.replace(current_app.config.get('WEB_HOST'), '') ok_url = urllib.parse.quote( current_app.config.get('WEB_HOST') + '/login?next=' + next_) ok_url_regist = urllib.parse.quote( current_app.config.get('WEB_HOST') + '/login?regist=complete?next=' + next_) else: ok_url = urllib.parse.quote( current_app.config.get('WEB_HOST') + '/login') ok_url_regist = urllib.parse.quote( current_app.config.get('WEB_HOST') + '/login?regist=complete') param = '?service=wizy&devices_type=WEB&ok_url=' silent_url = urllib.parse.quote( current_app.config.get('CLUB_RECOCHOKU_SILENT_RETURN') + param + ok_url) silent_url_r = urllib.parse.quote( current_app.config.get('CLUB_RECOCHOKU_SILENT_RETURN') + param + ok_url_regist) session.clear() silent_params = param + silent_url + '&ok_url_regist=' + silent_url_r if 'signup' in request.args: response = redirect( current_app.config.get('CLUB_RECOCHOKU_SIGNUP') + silent_params) else: response = redirect( current_app.config.get('CLUB_RECOCHOKU_LOGIN') + silent_params) response.set_cookie('agree', value=str(datetime.now().timestamp())) return response
def before_creator_view(): if 'CREATOR_IP_LIST' in current_app.config: if 'X-Forwarded-For' not in request.headers: abort(404) elif request.headers['X-Forwarded-For'] \ not in current_app.config.get('CREATOR_IP_LIST'): abort(404) if request.path in ['/_creator/signup', '/_creator/login', '/_creator/password']: # 認証不要 return if not current_user.is_anonymous and current_user.is_creator: # クリエイターでログイン済 return return redirect_(url_for('creator.login'))
def login(): """クリエイターのログイン画面""" if current_user.is_authenticated: logout_user_() return redirect_(url_for('creator.login')) form = CreatorLoginForm(request.form) if request.method == 'POST': if form.validate_on_submit(): auth_api = sw.AuthApi(api_client=g.api) auth = sw.Authenticate() auth.key = form.email.data auth.secret = form.password.data auth.device = check_device(user_agent=request.user_agent) try: token = auth_api.authenticate_post(authenticate=auth) current_app.logger.info("success login!") login_user_(token.access_token) return redirect_(url_for('creator.home')) except ApiException as ex: current_app.logger.warning('creator login: %s', ex) flash('メールアドレスまたはパスワードが不正です', category='error') else: flash('メールアドレスまたはパスワードが不正です', category='error') return render_template('creator_login.html', form=form)
def project_edit_item_question(project_id, item_id): question_form = ProjectItemQuestionForm(request.form) if question_form.validate_on_submit(): project_api = sw.ProjectApi(g.api) question = converter.item_question_form_to_api_item_question(question_form=question_form) if question.id: project_api.projects_project_id_items_item_id_questions_question_id_put(project_id=project_id, item_id=item_id, question_id=question.id, project_item_question=question) flash('アイテム質問を更新しました', category='info') else: project_api.projects_project_id_items_item_id_questions_post(project_id=project_id, item_id=item_id, project_item_question=question) flash('アイテム質問を追加しました', category='info') utils.flash_errors(question_form) return redirect_(url_for('creator.project_edit_item', project_id=project_id, item_id=item_id))
def project_edit_item(project_id): """プロジェクト(アイテム): 編集""" item_id = int(request.args.get('item_id')) if 'item_id' in request.args else None item_form = ProjectItemForm(request.form) project_api = sw.ProjectApi(g.api) if 'image' in request.files and request.files['image'].filename: image = request.files['image'] if image.content_length < 1048577: # 画像は1MB制限 file_path = utils.upload_file_to_s3(prefix='item', file=image) item = sw.ProjectItem() item.image = file_path project_api.projects_project_id_items_item_id_put(project_id=project_id, item_id=item_id, project_item=item) else: flash('画像は1MB以下にしてください', category='error') elif item_form.validate_on_submit(): item = converter.item_form_to_api_item(item_form) if item_id: project_api.projects_project_id_items_item_id_put(project_id=project_id, item_id=item_id, project_item=item) flash('アイテムを更新しました', category='info') else: project_api.projects_project_id_items_post(project_id=project_id, project_item=item) flash('アイテムを追加しました', category='info') return redirect_(url_for('creator.project_edit_item', project_id=project_id)) utils.flash_errors(item_form) project_api = sw.ProjectApi(g.api) project_ = project_api.projects_project_id_get(project_id=project_id) if not project_.id: return abort(404) items = project_api.projects_project_id_items_get(project_id=project_id) item_form = ProjectItemForm() questions_ = None if item_id: item_ = project_api.projects_project_id_items_item_id_get(project_id=project_id, item_id=item_id) item_form = converter.api_item_to_project_item_form(item_) questions_ = project_api.projects_project_id_items_item_id_questions_get(project_id=project_id, item_id=item_id) return render_template('creator_project_edit_item.html', title="Edit Project", item_id=item_id, project=project_, items=items, item_form=item_form, questions=questions_, question_form=ProjectItemQuestionForm(), form=DeleteForm())
def project_report(project_id): """プロジェクト: 活動報告""" report_id = int(request.args.get('report_id')) if 'report_id' in request.args else None report_form = ProjectReportForm(request.form) if report_form.validate_on_submit(): project_api = sw.ProjectApi(g.api) report_ = converter.report_form_to_api_report(report_form) if report_id: project_api.projects_project_id_reports_report_id_put(project_id=project_id, report_id=report_id, project_report=report_) flash('レポートを更新しました', category='info') else: project_api.projects_project_id_reports_post(project_id=project_id, project_report=report_) flash('レポートを追加しました', category='info') return redirect_(url_for('creator.project', project_id=project_id)) utils.flash_errors(report_form) project_api = sw.ProjectApi(api_client=g.api) project_ = project_api.projects_project_id_get(project_id=project_id) if report_id: report = project_api.projects_project_id_reports_report_id_get(project_id=project_id, report_id=report_id) report_form = converter.api_report_to_report_form(report) return render_template('creator_project_report.html', project=project_, form=report_form, report_id=report_id, form_image=ImageForm(), form_media=MediaForm())
def project_edit_faq(project_id): """プロジェクト(FAQ): 編集""" faq_id = int(request.args.get('faq_id')) if 'faq_id' in request.args else None faq_form = ProjectFaqForm(request.form) project_api = sw.ProjectApi(g.api) if faq_form.validate_on_submit(): faq = converter.project_faq_form_to_api_project_faq(faq_form=faq_form) if faq_id: project_api.projects_project_id_faqs_faq_id_put(project_id=project_id, faq_id=faq_id, project_faq=faq) flash('FAQを更新しました', category='info') else: project_api.projects_project_id_faqs_post(project_id=project_id, project_faq=faq) flash('FAQを追加しました', category='info') return redirect_(url_for('creator.project_edit_faq', project_id=project_id)) utils.flash_errors(faq_form) project_ = project_api.projects_project_id_get(project_id=project_id) project_faqs = project_api.projects_project_id_faqs_get(project_id=project_id) if faq_id: faq = project_api.projects_project_id_faqs_faq_id_get(project_id=project_id, faq_id=faq_id) faq_form = converter.api_project_faq_to_project_faq_form(faq) return render_template('creator_project_edit_faq.html', title="Edit Project", project=project_, project_faqs=project_faqs, faq_id=faq_id, faq_form=faq_form, form=DeleteForm())
def profile_edit() -> Response: """プロフィール編集""" my_api = sw.MyApi(api_client=g.api) profile_ = my_api.my_profile_get() basic_form = ProfileBasicForm(request.form) mail_form = MailMagazineForm(request.form) creator_form = CreatorProfileForm(request.form) password_form = CreatorPasswordForm(request.form) if request.method == 'POST': if basic_form.basic_submit.data and basic_form.validate_on_submit(): profile_.nickname = basic_form.nickname.data profile_.introduction = basic_form.profile.data my_api.my_profile_put(user=profile_) flash('プロフィールを更新しました', category='info') elif mail_form.mail_submit.data and mail_form.validate_on_submit(): for category in ['news', 'project', 'favorite']: mail_magazine = sw.MailMagazine() mail_magazine.category = category mail_magazine.checked = mail_form[category].data my_api.my_email_put(mail_magazine=mail_magazine) flash('メルマガ設定を更新しました', category='info') elif creator_form.creator_submit.data and creator_form.validate_on_submit( ): profile_.email = creator_form.email.data profile_.facebook = creator_form.facebook.data profile_.twitter = creator_form.twitter.data profile_.link = creator_form.link.data try: my_api.my_profile_put(user=profile_) flash('クリエイター情報を更新しました', category='info') except ApiException as ex: current_app.logger.warning('creator profile error: %s', ex) flash('クリエイター情報の更新に失敗しました', category='error') elif password_form.password_submit.data and password_form.validate_on_submit( ): # TODO パスワードの更新 print(password_form.data) flash('パスワードを更新しました', category='info') utils.flash_errors(basic_form) utils.flash_errors(mail_form) utils.flash_errors(creator_form) utils.flash_errors(password_form) return redirect_(url_for('front.profile_edit')) else: if 'profile_image' in session and utils.profile_tmp_image_is_not_exists( session['profile_image']): utils.delete_profile_tmp_image(session['profile_image']) session.pop('profile_image') profile_ = my_api.my_profile_get() basic_form.nickname.data = profile_.nickname basic_form.profile.data = profile_.introduction emails_ = my_api.my_email_get() for email in emails_: mail_form[email.category].data = email.checked creator_form.email.data = profile_.email creator_form.facebook.data = profile_.facebook creator_form.twitter.data = profile_.twitter creator_form.link.data = profile_.link return render_template('profile_edit.html', profile=profile_, image_form=ImageForm(), basic_form=basic_form, mail_form=mail_form, creator_form=creator_form, password_form=password_form)
def logout() -> Response: """ログアウト""" logout_user_() return redirect_(url_for('creator.login'))
def unauthorized_handler(): return redirect_(url_for('front.home'))