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 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 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.'})
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)
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())
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 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)
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
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)
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_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())
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 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)
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 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 })
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
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)
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
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)
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')
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 home(): """クリエイター: ホーム画面""" project_api = sw.ProjectApi(api_client=g.api) projects = project_api.projects_get() return render_template('creator_home.html', projects=projects)
def projects() -> Response: """プロジェクト一覧ページ""" project_api = sw.ProjectApi(api_client=g.api) projects = project_api.projects_get() return render_template('projects.html', projects=projects)
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': '想定外のエラーが発生しました。しばらくしてからやり直してください。' })
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_)