Ejemplo n.º 1
0
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'))
Ejemplo n.º 2
0
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'))
Ejemplo n.º 3
0
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'))
Ejemplo n.º 4
0
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))
Ejemplo n.º 5
0
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'))
Ejemplo n.º 6
0
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'))
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
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)
Ejemplo n.º 9
0
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
Ejemplo n.º 10
0
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'))
Ejemplo n.º 11
0
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)
Ejemplo n.º 12
0
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))
Ejemplo n.º 13
0
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())
Ejemplo n.º 14
0
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())
Ejemplo n.º 15
0
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())
Ejemplo n.º 16
0
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)
Ejemplo n.º 17
0
def logout() -> Response:
    """ログアウト"""
    logout_user_()
    return redirect_(url_for('creator.login'))
Ejemplo n.º 18
0
def unauthorized_handler():
    return redirect_(url_for('front.home'))