def list_city(city_id=None):
    spots = ChootripApi.get_city_spots(city_id=int(city_id))
    city = ChootripApi.get_city(city_id)
    spots = set_cart_added(spots)
    spots = set_one_image(spots)

    return render_template('list_spots.html',
                           segment_name=city['name'],
                           spots=spots)
def confirm_cart():
    if len(session['cart']) != 10:
        flash('10件選択してください', 'danger')
        return redirect(url_for('list_cart'))
    session['confirm'] = True
    # spots = list(map(lambda spot_id: ChootripApi.get_spot(spot_id), session['cart']))
    spots = ChootripApi.get_spots(session['cart'])
    spots = set_cart_added(spots)
    spots = set_one_image(spots)
    return render_template('confirm_cart.html', spots=spots)
def search_result():
    q = request.args.get('q')
    q = q.strip()
    if q:
        spots = ChootripApi.get_spots_by_title_search(q)
    else:
        spots = []
    spots = set_cart_added(spots)
    spots = set_one_image(spots)
    return render_template('search_result.html', search_word=q, spots=spots)
def show_recommend():
    if len(session['cart']) != 10:
        flash('不正な入力です', 'danger')
        return redirect(url_for('top'))
    # TODO: もうすでにこの学籍番号のデータが登録されている場合は,ここで弾く
    session.pop('confirm', None)

    # GET: RECOMMEND_SPOTS
    # keys: ['similarities', 'user_vec']
    recommend_data = ChootripApi.get_recommend(session['cart'])
    recommend_spots = extract_10_recommend_spots(
        similarities_dict=recommend_data['similarities'])

    topics_with_words = get_topics_with_words()

    # GET: PREFERENCE
    s = SpreadSheet()
    normalized_user_vec = recommend_data['normalized_user_vec']
    s.update_normalized_topic_result(session['username'], normalized_user_vec)
    user_vec = recommend_data['user_vec']
    s.update_topic_result(session['username'], user_vec)

    selected_spots = ChootripApi.get_spots(session['cart'])
    selected_spots_name = []
    for selected_spot in selected_spots:
        selected_spots_name.append(selected_spot['title'])
    s.update_selected_spots(session['username'], selected_spots_name)

    recommend_spots_name = []
    for recommend_spot in recommend_spots:
        recommend_spots_name.append(recommend_spot['title'])
    s.update_recommend_result(session['username'], recommend_spots_name)

    return render_template('recommends.html',
                           recommend_spots=recommend_spots,
                           topics=zip(topics_with_words, normalized_user_vec))
def extract_10_recommend_spots(similarities_dict):
    similarities_sorted = sorted(similarities_dict.items(),
                                 key=lambda x: -x[1])
    # chunk_size件ずつ条件にあったスポットを取り出す
    chunk_size = 50
    chunked_similarities = [
        similarities_sorted[n:n + chunk_size]
        for n in range(0, len(similarities_sorted), chunk_size)
    ]
    recommend_spots = []
    for similarities_by_chunk_size in chunked_similarities:
        spot_ids = []
        for spot_similarity_info in similarities_by_chunk_size:
            spot_id = spot_similarity_info[0]
            _similarity = spot_similarity_info[1]
            spot_ids.append(spot_id)
        spots = ChootripApi.get_spots(spot_ids)
        recommend_spots.extend(spots)

        # exclude selected spots
        recommend_spots = list(
            filter(lambda s: s['id'] not in session['cart'], recommend_spots))

        # extract by counts
        recommend_spots = list(
            filter(lambda s: s['count'] >= 153, recommend_spots))

        # set similarity
        for spot in recommend_spots:
            spot['similarity'] = similarities_dict[str(spot['id'])]

        # sort
        recommend_spots = list(
            sorted(recommend_spots, key=lambda s: -s['similarity']))

        if len(recommend_spots) > 10:
            break
    return recommend_spots[:10]
def select_city(prefecture_id=None):
    cities = ChootripApi.get_cities(prefecture_id)
    cities = list(filter(lambda city: city['spot_count'] != 0, cities))
    chunked_cities = [cities[n:n + 3] for n in range(0, len(cities), 3)]
    return render_template('select_city.html', cities=chunked_cities)
def get_topics():
    topics = ChootripApi.get_topics()['topics']
    return topics
def list_cart():
    spots = list(
        map(lambda spot_id: ChootripApi.get_spot(spot_id), session['cart']))
    spots = set_cart_added(spots)
    spots = set_one_image(spots)
    return render_template('list_cart.html', spots=spots)
from flask import Flask, render_template, request, session, redirect, url_for, jsonify, flash
import os
from chootrip_api import ChootripApi
from experiment_db import SpreadSheet

# from google.cloud import datastore

app = Flask(__name__)
app.config["SECRET_KEY"] = os.environ.get('SECRET_KEY')
prefectures = ChootripApi.get_prefectures()


@app.context_processor
def inject_pref():
    return dict(prefectures=prefectures)


@app.context_processor
def inject_cart_count():
    if 'cart' in session:
        return dict(count=len(session['cart']))
    else:
        return dict(count=0)


@app.context_processor
def override_url_for():
    return dict(url_for=dated_url_for)


def dated_url_for(endpoint, **values):