Пример #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'))
Пример #2
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))
Пример #3
0
def api_delete():
    if not current_user.is_authenticated:
        return jsonify({'login': False})
    if current_user.is_user:
        return jsonify({'login': False})
    form = DeleteForm(request.form)
    if form.validate_on_submit():
        project_api = sw.ProjectApi(g.api)
        if form.question_id.data:
            project_api.projects_project_id_items_item_id_questions_question_id_delete(
                project_id=form.id.data,
                item_id=form.item_id.data,
                question_id=form.question_id.data)
            return jsonify({'msg': 'delete project item question.'})
        if form.item_id.data:
            project_api.projects_project_id_items_item_id_delete(
                project_id=form.id.data, item_id=form.item_id.data)
            return jsonify({'msg': 'delete project item.'})
        if form.faq_id.data:
            project_api.projects_project_id_faqs_faq_id_delete(
                project_id=form.id.data, faq_id=form.faq_id.data)
            return jsonify({'msg': 'delete project faq.'})
        if form.report_id.data:
            project_api.projects_project_id_reports_report_id_delete(
                project_id=form.id.data, report_id=form.report_id.data)
            return jsonify({'msg': 'delete project report.'})
        if form.id.data:
            project_api.projects_project_id_delete(project_id=form.id.data)
            return jsonify({'msg': 'delete project.'})
    return jsonify({'msg': 'does not delete.'})
Пример #4
0
def project_report(project_id: int, report_id: int) -> Response:
    """
    プロジェクト レポート

    :param project_id: プロジェクトID
    :param report_id: レポートID
    """
    project_api = sw.ProjectApi(api_client=g.api)
    project_ = project_api.projects_project_id_get(project_id=project_id)
    if not project_.id:
        return abort(404)
    reports, has_new_report = get_project_reports(project_id=project_id)
    is_supporter = project_id in user_support_project_ids()
    selected, next_report, previous_report = search_next_report(
        reports=reports, report_id=report_id)
    if not selected:
        return abort(404)
    creator_api = sw.CreatorApi(g.api)
    creator = creator_api.creators_user_id_get(user_id=project_.user_id)
    return render_template('project_report.html',
                           project=project_,
                           report=selected,
                           creator=creator,
                           previous_report=previous_report,
                           next_report=next_report,
                           is_supporter=is_supporter)
Пример #5
0
def api_questions(project_id, item_id, question_id):
    if not current_user.is_authenticated:
        return jsonify({'login': False})
    if current_user.is_user:
        return jsonify({'login': False})
    project_api = sw.ProjectApi(g.api)
    question = project_api.projects_project_id_items_item_id_questions_question_id_get(
        project_id=project_id, item_id=item_id, question_id=question_id)
    return jsonify(question.to_dict())
Пример #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'))
Пример #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)
Пример #8
0
def home() -> Response:
    """トップページ"""
    project_api = sw.ProjectApi(api_client=g.api)
    popular_projects = project_api.projects_get(popular=True)
    pickup_projects = project_api.projects_get(pickup=True)
    pickup_project = None
    for project_ in pickup_projects:
        pickup_project = project_
    return render_template('index.html',
                           top_project=pickup_project,
                           projects=popular_projects)
Пример #9
0
def get_item_answers(project_id: int, item_id: int, form: dict):
    answers = []
    project_api = sw.ProjectApi(g.api)
    questions = project_api.projects_project_id_items_item_id_questions_get(
        project_id=project_id, item_id=item_id)
    for question in questions:
        key = 'answer_' + str(question.id)
        if key in form:
            answer = sw.Answer()
            answer.id = question.id
            answer.value = form[key]
            answers.append(answer)
    return answers
Пример #10
0
def profile_support() -> Response:
    """プロフィール"""
    my_api = sw.MyApi(api_client=g.api)
    profile_ = my_api.my_profile_get()
    supports = my_api.my_supports_get()
    for support in supports:
        project_api = sw.ProjectApi(api_client=g.api)
        project_ = project_api.projects_project_id_get(
            project_id=support.project_id)
        if project_:
            support.project_title = project_.title
            support.project_image = project_.image
            support.project_status = project_.public_status
            support.project_status_text = project_status_text(project_)
            support.project_end_time = project_.end_time
        item_ = project_api.projects_project_id_items_item_id_get(
            project_id=support.project_id, item_id=support.item_id)
        if item_:
            support.item_name = item_.name
        if item_.shipping:  # 配送ありの場合はお届け先を表示
            shipping = my_api.my_shippings_support_id_get(
                support_id=support.support_id)
            if shipping.zipcode:
                from web.modules.form import states
                pref_name = [
                    state[1] for state in states if state[0] == shipping.pref
                ]
                if pref_name and len(pref_name) > 0:
                    shipping.pref_name = pref_name[0]
                zipcode = shipping.zipcode
                if shipping.zipcode and len(shipping.zipcode) == 7:
                    zipcode = shipping.zipcode[:3] + '-' + shipping.zipcode[3:]
                support.shipping_address = '%s %s %s %s %s' % (
                    zipcode, shipping.pref_name, shipping.town,
                    shipping.address, shipping.building)
        if support.status == 1:  # 決済未完了の場合は支払い情報を表示
            order = my_api.my_orders_order_id_get(order_id=support.order_id)
            if order:
                if order.cust_id:
                    support.payment_code = order.cust_id + '-' + order.conf_no
                if order.receipt_no:
                    support.payment_code = order.receipt_no + '-' + order.conf_no
                    from web.modules.form import cvs_code
                    support.payment_cvs_name = [
                        code[1] for code in cvs_code
                        if str(code[0]) == order.cvs_code
                    ][0]
                support.payment_term = order.payment_term
    return render_template('profile_support.html',
                           profile=profile_,
                           supports=supports)
Пример #11
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())
Пример #12
0
def project_edit_detail(project_id):
    """プロジェクト(詳細): 編集"""
    detail_form = ProjectDetailForm(request.form)
    project_api = sw.ProjectApi(g.api)
    if detail_form.validate_on_submit():
        project_ = converter.project_detail_form_to_api_project(detail_form=detail_form)
        project_api.projects_project_id_put(project_id=project_id, project=project_)
        flash('プロジェクト(詳細情報)を更新しました', category='info')
    utils.flash_errors(detail_form)
    project_ = project_api.projects_project_id_get(project_id=project_id)
    detail_form = converter.api_project_to_project_detail_form(project_)
    return render_template('creator_project_edit_detail.html', title="Edit Project",
                           project=project_, detail_form=detail_form,
                           image_form=ImageForm(), media_form=MediaForm())
Пример #13
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())
Пример #14
0
def profile_favorite() -> Response:
    """お気に入り"""
    my_api = sw.MyApi(api_client=g.api)
    profile_ = my_api.my_profile_get()
    favorites = my_api.my_favorites_get()
    for favorite in favorites:
        project_api = sw.ProjectApi(api_client=g.api)
        projects_ = project_api.projects_get(creator=favorite.creator_id)
        for project_ in projects_:
            favorite.project_id = project_.id
            favorite.project_title = project_.title
            favorite.project_image = project_.image
            favorite.project_summary = project_.summary
    return render_template('profile_favorite.html',
                           profile=profile_,
                           favorites=favorites)
Пример #15
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))
Пример #16
0
def api_validators(project_id, item_id):
    if not current_user.is_authenticated:
        return jsonify({'login': False})
    project_api = sw.ProjectApi(g.api)
    questions = project_api.projects_project_id_items_item_id_questions_get(
        project_id=project_id, item_id=item_id)
    fields = {}
    for question in questions:
        rules = []
        if question.is_required:
            # 必須チェック
            rules.append({
                'type': 'empty',
                'prompt': '「%s」を入力してください' % question.description
            })
        if question.type == 'number':
            if question.is_required and question.format:
                # 数値:範囲チェック
                rules.append({
                    'type':
                    'integer[%s]' %
                    question.format.replace('-', ',').replace(',', '..'),
                    'prompt':
                    '「%s」は%sの範囲で入力してください' % (
                        question.description,
                        question.format.replace('-', 'から'),
                    )
                })
            else:
                rules.append({
                    'type':
                    'maxLength[10]',
                    'prompt':
                    '「%s」は10桁以内で入力してください' % question.description
                })
        fields['answer_' + str(question.id)] = {
            'identifier': 'answer_' + str(question.id),
            'rules': rules
        }
    return jsonify({
        'on': 'blur',
        'keyboardShortcuts': False,
        'fields': fields
    })
Пример #17
0
def get_project_reports(project_id: int) -> (list, bool):
    """
    レポートの一覧を取得する。更新のある記事かどうかの判定も一緒に行う。

    :param project_id: プロジェクトID
    :return: レポート一覧
    """
    project_api = sw.ProjectApi(api_client=g.api)
    reports = project_api.projects_project_id_reports_get(
        project_id=project_id)
    has_new_report = False
    public_reports = []
    for index, report in enumerate(reports):  # 1週間以内の場合はNEWを表示
        if report.accessible == 'private':
            continue
        if report.update_date + timedelta(days=7) > datetime.today():
            report.is_new, has_new_report = True, True
        public_reports.append(report)
    return public_reports, has_new_report
Пример #18
0
def project_reports(project_id: int) -> Response:
    """
    プロジェクト レポート一覧

    :param project_id: プロジェクトID
    """
    project_api = sw.ProjectApi(api_client=g.api)
    project_ = project_api.projects_project_id_get(project_id=project_id)
    if not project_.id:
        return abort(404)
    reports, has_new_report = get_project_reports(project_id=project_id)
    is_supporter = project_id in user_support_project_ids()
    creator_api = sw.CreatorApi(g.api)
    creator = creator_api.creators_user_id_get(user_id=project_.user_id)
    return render_template('project_reports.html',
                           project=project_,
                           reports=reports,
                           creator=creator,
                           is_supporter=is_supporter)
Пример #19
0
def get_project_items(project: sw.Project) -> list:
    """
    アイテムの一覧を取得する。サポート可能かどうかの判定も一緒に行う。
    :param project: プロジェクト情報
    :return: アイテム一覧
    """
    today = datetime.today()
    my_api = sw.MyApi(api_client=g.api)
    supports = my_api.my_supports_get()
    project_api = sw.ProjectApi(api_client=g.api)
    items = project_api.projects_project_id_items_get(project_id=project.id)
    for item in items:
        if project.public_status in (1, 3, 4):  # 1:公開前,2:公開中(募集終了),3:非公開
            item.error_message = '募集期間外'
        elif today < project.start_time or project.end_time < today:
            item.error_message = '募集期間外'
        elif -1 < item.limit <= item.expected_supports:
            item.error_message = '在庫切れ'
        elif -1 < item.limit_user <= len(
            [support for support in supports if support.item_id == item.id]):
            item.error_message = '購入制限超え'
    return items
Пример #20
0
def project_edit_basic(project_id):
    """プロジェクト(基本情報): 編集"""
    basic_form = ProjectBasicForm(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='project', file=image)
            project_ = sw.Project()
            project_.image = file_path
            project_api.projects_project_id_put(project_id=project_id, project=project_)
        else:
            flash('画像は1MB以下にしてください', category='error')
    elif basic_form.validate_on_submit():
        project_ = converter.project_form_to_api_project(basic_form)
        project_api.projects_project_id_put(project_id=project_id, project=project_)
        flash('プロジェクト(基本情報)を更新しました', category='info')
    utils.flash_errors(basic_form)
    project_ = project_api.projects_project_id_get(project_id=project_id)
    basic_form = converter.api_project_to_project_form(project_)
    return render_template('creator_project_edit_basic.html', title="Edit Project",
                           project=project_, basic_form=basic_form)
Пример #21
0
def dynamic_css_project(project_id: int):
    redis = current_app.config.get('SESSION_REDIS')
    cache_key = 'dynamic_css_project_%s' % project_id
    if not redis.exists(cache_key):
        from colour import Color
        import math
        project_api = sw.ProjectApi(api_client=g.api)
        project = project_api.projects_project_id_get(project_id=project_id)
        if project.id:
            cc = Color(color=project.accent_color)
            accent_color_rgb = '%s, %s, %s' % (math.floor(
                cc.get_red() * 255), math.floor(
                    cc.get_green() * 255), math.floor(cc.get_blue() * 255))
            cdn_base_url = current_app.config.get('CDN_BASE_URL')
            stylesheet_str = render_template('project.css.template',
                                             accent_color=project.accent_color,
                                             accent_color_rgb=accent_color_rgb,
                                             cdn_base_url=cdn_base_url)
            redis.set(cache_key, stylesheet_str, ex=60)
        else:
            abort(404)
    content = redis.get(cache_key)
    return Response(content, content_type='text/css')
Пример #22
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())
Пример #23
0
def home():
    """クリエイター: ホーム画面"""
    project_api = sw.ProjectApi(api_client=g.api)
    projects = project_api.projects_get()
    return render_template('creator_home.html', projects=projects)
Пример #24
0
def projects() -> Response:
    """プロジェクト一覧ページ"""
    project_api = sw.ProjectApi(api_client=g.api)
    projects = project_api.projects_get()
    return render_template('projects.html', projects=projects)
Пример #25
0
def api_checkout():
    if not current_user.is_authenticated:
        return jsonify({
            'code': '403',
            'retryable': False,
            'message': 'ログインし直してください。'
        })
    print(request.form)
    form = CheckoutForm(request.form)
    if form.validate_on_submit():
        print(form.data)
        checkout = sw.Checkout()
        checkout.payment_type = form.payment_type.data
        # 住所情報
        checkout.zip_code = form.shipping_zipcode.data.replace('-', '')
        checkout.pref = form.shipping_state.data
        checkout.town = form.shipping_town.data
        checkout.address = form.shipping_address.data
        checkout.building = form.shipping_building.data
        checkout.phone = form.shipping_phone.data.replace('-', '')
        checkout.full_name = join_name(form.shipping_last_name.data,
                                       form.shipping_first_name.data)
        if checkout.payment_type == 'credit':
            checkout.card_token = form.payment_credit_token.data
        if checkout.payment_type == 'cvs':
            checkout.cvs_code = form.payment_cvs_code.data
            checkout.customer_name = join_name(
                form.payment_cvs_last_name.data,
                form.payment_cvs_first_name.data)[:20]
            checkout.customer_kana = join_name(
                form.payment_cvs_last_name_kana.data,
                form.payment_cvs_first_name_kana.data)[:20]
            checkout.customer_tel_no = form.payment_cvs_tel_no.data.replace(
                '-', '')
        if checkout.payment_type == 'payeasy':
            checkout.customer_name = join_name(
                form.payment_payeasy_last_name.data,
                form.payment_payeasy_first_name.data)[:20]
            checkout.customer_kana = join_name(
                form.payment_payeasy_last_name_kana.data,
                form.payment_payeasy_first_name_kana.data)[:20]
            checkout.customer_tel_no = form.payment_payeasy_tel_no.data.replace(
                '-', '')
        project_id = form.project_id.data
        item_id = form.item_id.data
        checkout.answers = get_item_answers(project_id=project_id,
                                            item_id=item_id,
                                            form=request.form)
        print(checkout)
        try:
            project_api = sw.ProjectApi(g.api)
            result = project_api.projects_project_id_items_item_id_checkout_post(
                project_id=project_id, item_id=item_id, checkout=checkout)
            print(result)
            return jsonify(result.to_dict())
        except ApiException as ex:
            current_app.logger.error(ex)
            print(ex.status)
            print(ex.reason)
            return jsonify(json.loads(ex.body))
    print(form.errors)
    print(form.data)
    return jsonify({
        'code': '403',
        'retryable': False,
        'message': '想定外のエラーが発生しました。しばらくしてからやり直してください。'
    })
Пример #26
0
def supports(project_id):
    """サポート: 一覧"""
    project_api = sw.ProjectApi(api_client=g.api)
    project_ = project_api.projects_project_id_get(project_id=project_id)
    return render_template('creator_supports.html', project=project_)