Example #1
0
def u_recommend(userid,c_userid=None):
    """アソシエーション・ルール・マイニングによるレコメンド"""
    # データ整形
    transactions = []
    if c_userid is not None:
        followed = UserConnect.select_follows_user_id_by_user_id(c_userid)
        followed = sum(followed, ())
    users = User.query.all()
    for user in users:
        u_id = user.User_id
        follow_id = UserConnect.select_follows_user_id_by_user_id(u_id)
        follow_id = sum(follow_id, ())
        transactions.append(follow_id)
    print(transactions)
    if c_userid is not None:
        u_recommends = associationRules(transactions,userid,followed,c_userid)
    else:
        u_recommends = associationRules(transactions,userid)
    r_user_list = []
    if u_recommends:
        for u_recommend in u_recommends:
            u_recommend_id = int(u_recommend)
            r_user_list.append(User.select_user_by_id(u_recommend_id))
    elif not u_recommends:
        r_user_list = []
    return r_user_list
Example #2
0
def transaction(item_id):
    """取引画面処理"""
    item = Sell.select_sell_by_sell_id(item_id)
    buy = Buy.select_buy_by_sell_id(item_id)
    shippingaddress = ShippingAddress.search_shippingaddress(buy.ShippingAddress_id)
    messageform = DealMessageForm(request.form)
    messages = DealMessage.get_messages_by_sell_id(item_id)
    noticeform = NoticeRatingForm(request.form)
    # ログイン中のユーザーが出品者だった場合
    if current_user.User_id == item.User_id:
        dest_user = User.select_user_by_id(buy.User_id)
    # ログイン中のユーザーが購入者だった場合
    elif current_user.User_id == buy.User_id:
        dest_user = User.select_user_by_id(item.User_id)
    read_message_ids = [message.DealMessage_id for message in messages if (not message.is_read) and (message.from_user_id == int(dest_user.User_id))]
    if read_message_ids:
        with db.session.begin(subtransactions=True):
            # is_readをTrueに更新
            DealMessage.update_is_read_by_ids(read_message_ids)
        db.session.commit()
    not_checked_message_ids = [message.DealMessage_id for message in messages if message.is_read and (not message.is_checked) and (message.from_user_id == int(current_user.User_id))]
    if not_checked_message_ids:
        with db.session.begin(subtransactions=True):
            DealMessage.update_is_checked_by_ids(not_checked_message_ids)
        db.session.commit()
    if request.method == 'POST' and messageform.validate(read_message_ids):
        dealmessage = DealMessage(
            Sell_id = item_id,
            to_user_id = dest_user.User_id,
            from_user_id = current_user.User_id,
            message = messageform.message.data
        )
        # データベース登録処理
        with db.session.begin(subtransactions=True):
            dealmessage.create_new_dealmessage()
        db.session.commit()
        return redirect(url_for('transaction.transaction', item_id=item_id))
    return render_template(
        'transaction/transaction.html',
        item=item,
        buy=buy,
        shippingaddress=shippingaddress,
        messageform=messageform,
        messages=messages,
        dest_user=dest_user,
        noticeform=noticeform
    )
Example #3
0
def load_old_messages():
    dest_user_id = request.args.get('dest_user_id', -1, type=int)
    sell_id = request.args.get('sell_id', -1, type=int)
    offset_value = request.args.get('offset_value', -1, type=int)
    if dest_user_id == -1 or offset_value == -1:
        return
    messages = DealMessage.get_messages_by_sell_id(sell_id, offset_value*5)
    dest_user = User.select_user_by_id(dest_user_id)
    return jsonify(data=make_old_deal_message_format(dest_user, messages))
Example #4
0
def mail_reset_complete(token):
    # トークンに紐づいたユーザーIDを得る
    mailResetToken = MailResetToken.get_user_id_by_token(token)
    if not mailResetToken:
        return redirect(url_for('route.home'))
    # mailResetToken.User_idによってユーザーを絞り込みUserテーブルのデータを取得
    user = User.select_user_by_id(int(mailResetToken.User_id))
    # データベース処理
    with db.session.begin(subtransactions=True):
        # メール更新処理
        user.email = mailResetToken.email
        # トークンレコード削除
        MailResetToken.delete_token(token)
    db.session.commit()
    return render_template('mypage/mail_reset_complete.html')
Example #5
0
def profile():
    form = ProfileForm(request.form)
    if request.method == 'POST' and form.validate():
        # ログイン中のユーザーIDによってユーザーを取得
        user = User.select_user_by_id(current_user.get_id())
        #ユーザーコードの重複チェック--------------------------
        # 画像アップロード処理 ここから--------------------------
        imagename = ''
        image = request.files[form.picture_path.name]
        if image:
            # 画像アップロード処理用関数
            if allowed_image(image.filename):
                # ファイル名から拡張子を取り出す
                ext = image.filename.rsplit('.', 1)[1]
                # imagenameはユーザーID+現在の時間+.拡張子
                imagename = str(user.User_id) + '_' + \
                            str(int(datetime.datetime.now().timestamp())) + '.' + ext
                # ファイルの保存
                image.save(
                    os.path.join(app.config["ORIGINAL_IMAGE_UPLOADS"],
                                 imagename))
                im = Image.open(
                    os.path.join(app.config["ORIGINAL_IMAGE_UPLOADS"],
                                 imagename))
                # 最大サイズの正方形に切り出したあと、200に縮小
                im_thumb = crop_max_square(im).resize((200, 200),
                                                      Image.LANCZOS)
                # ファイルの保存
                im_thumb.save(
                    os.path.join(app.config["IMAGE_UPLOADS"], imagename))
            else:
                flash('画像のアップロードに失敗しました。')
                return redirect(url_for('mypage.profile'))
        # 画像アップロード処理 ここまで--------------------------
        # データベース処理
        with db.session.begin(subtransactions=True):
            user.username = form.username.data
            user.user_code = form.usercode.data
            user.prof_comment = form.prof_comment.data
            if imagename:  # imagenameが設定されていれば(画像があれば)更新する
                user.picture_path = imagename
        db.session.commit()
        flash('プロフィール情報を更新しました。')
    return render_template('mypage/profile.html', form=form)
Example #6
0
def message_ajax():
    dest_user_id = request.args.get('dest_user_id', -1, type=int)
    sell_id = request.args.get('sell_id', -1, type=int)
    dest_user = User.select_user_by_id(dest_user_id)
    not_read_messages = DealMessage.select_not_read_messages(dest_user_id, current_user.User_id, sell_id)
    not_checked_messages = DealMessage.select_not_checked_messages(current_user.User_id, dest_user_id, sell_id)
    not_read_message_ids = [not_read_message.DealMessage_id for not_read_message in not_read_messages]
    if not_read_message_ids:
        with db.session.begin(subtransactions=True):
            # is_readをTrueに更新
            DealMessage.update_is_read_by_ids(not_read_message_ids)
        db.session.commit()
    not_checked_message_ids = [not_checked_message.DealMessage_id for not_checked_message in not_checked_messages]
    if not_checked_message_ids:
        with db.session.begin(subtransactions=True):
            # is_checkedをTrueに更新
            DealMessage.update_is_checked_by_ids(not_checked_message_ids)
        db.session.commit()
    return jsonify(data=make_deal_message_format(dest_user, not_read_messages), checked_message_ids=not_checked_message_ids)
Example #7
0
def reset_password(token):
    form = ResetPasswordForm(request.form)
    # トークンに紐づいたユーザーIDを得る
    reset_user_id = PasswordResetToken.get_user_id_by_token(token)
    if not reset_user_id:
        return redirect(url_for('route.home'))
    if request.method == 'POST' and form.validate():
        password = form.password.data
        # reset_user_idによってユーザーを絞り込みUserテーブルのデータを取得
        user = User.select_user_by_id(reset_user_id)
        # データベース処理
        with db.session.begin(subtransactions=True):
            user.password = password
            # トークンレコード削除
            PasswordResetToken.delete_token(token)
        db.session.commit()
        flash('パスワードを再設定しました。')
        return redirect(url_for('auth.login'))
    return render_template('auth/reset_password.html', form=form)
Example #8
0
def recommend(c_userid):
    """協調フィルタリングユーザーベースレコメンド"""
    # 商品レコメンド
    recommends = getRecommendations(str(c_userid))
    # ユーザーレコメンド
    u_recommends = topMatches(str(c_userid))
    r_item_list = []
    if recommends is not None:
        for recommend in recommends:
            recommend_id = int(recommend)
            r_item_list.append(Sell.select_sell_by_sell_id(recommend_id))
    elif recommends is None:
        r_item_list = []
    r_user_list = []
    if u_recommends is not None:
        for u_recommend in u_recommends:
            u_recommend_id = int(u_recommend)
            r_user_list.append(User.select_user_by_id(u_recommend_id))
    elif u_recommends is None:
        r_user_list = []
    return r_item_list, r_user_list
Example #9
0
def todolist():
    """やることリスト"""
    user_id = current_user.get_id()
    now = datetime.datetime.now()
    items = Sell.select_sall_status(user_id)
    todolists =[]
    for item in items:
        elapsed = now - item.update_at
        todolist_data = {"item" : None, "status" : 0, "elapsed_time" : "", "partner_username" : "", "partner_user_code" : "", "partner_picture_path" : ""}
        # 出品者
        if item.User_id==user_id:
            buy_data = Buy.select_buy_by_sell_id(item.Sell_id)
            todolist_data["partner_username"] = User.select_user_by_id(buy_data.User_id).username
            todolist_data["partner_user_code"] = User.select_user_by_id(buy_data.User_id).user_code
            todolist_data["partner_picture_path"] = User.select_user_by_id(buy_data.User_id).picture_path
            rating = Rating.select_count_sell_id_to_user_id(item.Sell_id, user_id)
            # 未発送
            if item.has_sent == item.has_got == False:
                todolist_data["status"] = 1
            # 発送済みで受け取り・評価待ち
            elif item.has_sent == True and item.has_got == False:
                todolist_data["status"] = 4
            # 受け取り済みで相手が相互評価して自分がしてない
            elif item.has_sent == item.has_got == True and rating == 1:
                todolist_data["status"] = 2
                rating_datas=Rating.select_sell_id_to_user_id(item.Sell_id, user_id)
                for rating_data in rating_datas:
                    print(rating_data.update_at)
                    elapsed = now - rating_data.update_at
                    print(elapsed.days/7)
        #購入者 
        else:
            todolist_data["partner_username"] = User.select_user_by_id(item.User_id).username
            todolist_data["partner_user_code"] = User.select_user_by_id(item.User_id).user_code
            todolist_data["partner_picture_path"] = User.select_user_by_id(item.User_id).picture_path
            rating = Rating.select_count_sell_id_to_user_id(item.Sell_id, item.User_id)
            # 発送済みで商品を受取ってない
            if item.has_sent == True and item.has_got == False:
                todolist_data["status"] = 3
            # 発送待ち
            elif item.has_sent == item.has_got == False:
                todolist_data["status"] = 4
            # 評価待ち
            elif item.has_sent == item.has_got == True:
                todolist_data["status"] = 4
        print("*"*100)
        print(elapsed.days/7)
        # 経過時間
        if not elapsed.days//365 == 0:
            elapsed_time = str(elapsed.days//365) + "年"
        elif not elapsed.days//30 == 0:
            elapsed_time = str(elapsed.days//30) + "ヶ月"
        elif not elapsed.days//7 == 0:
            elapsed_time = str(elapsed.days//7) + "週間"
        elif not elapsed.days == 0:
            elapsed_time = str(elapsed.days) + "日"
        elif not elapsed.seconds//3600 == 0:
            elapsed_time = str(elapsed.seconds//3600) + "時間"
        elif not elapsed.seconds//60 == 0:
            elapsed_time = str(elapsed.seconds//60) + "分"
        else:
            elapsed_time = str(elapsed.seconds) + "秒"
        print(elapsed.seconds//60)
        print("*"*100)
        todolist_data["item"] = item
        todolist_data["elapsed_time"] = elapsed_time
        todolists.append(todolist_data)
        
    return render_template('todolist/todolist.html', todolists=todolists)
Example #10
0
def mail_password():
    form = ChangePasswordForm(request.form)
    if request.method == 'POST' and form.validate():
        # ログイン中のユーザーIDによってユーザーを取得
        user = User.select_user_by_id(current_user.get_id())
        pass_f = 0
        mail_f = 0
        # パスワードの変更フラグ
        if not form.now_password.data == '':
            now_password = form.now_password.data
            # 現在のパスワードチェック
            if user.validate_password(now_password):
                password = form.password.data
                pass_f = 1
            else:
                flash('現在のパスワードが誤っています。')
        # emailの変更フラグ
        if not user == User.select_user_by_email(form.email.data):
            token = ''
            email = form.email.data
            mail_f = 1
        # データベース処理
        with db.session.begin(subtransactions=True):
            # パスワード更新
            if pass_f == 1:
                # パスワード更新処理
                user.password = password
            # email更新
            if mail_f == 1:
                token = MailResetToken.publish_token(user, form.email.data)
        db.session.commit()
        print(str(mail_f) + 'メールフラグ')
        if mail_f == 1:
            # メール送信処理ここから----------------------------------------------------------
            msg = Message('古書邂逅 メールアドレス変更手続きを完了してください', recipients=[email])
            msg.html = '<hr>【古書邂逅】 古書邂逅会員メールアドレス変更のお知らせ<hr>\
                        古書邂逅をご利用いただきありがとうございます。<br>\
                        以下のURLをクリックして、メールアドレス変更手続きを完了してください<br>\
                        このURLの有効期限は24時間です。<br>\
                        <br><br>\
                        【ご登録されたメールアドレス】<br>\
                        {email}<br>\
                        【こちらをクリックして登録を完了させてください。】<br>\
                        {url}'.format(email=email,
                                      url=url_for('mypage.mail_reset_complete',
                                                  token=token,
                                                  _external=True))
            mail.send(msg)
            # メール送信処理ここまで----------------------------------------------------------
            # デバッグ用---------------------------------------------------------------
            print('*' * 120)
            print(
                f'本登録URL: http://127.0.0.1:5000/mypage/mail_reset_complete/{token}'
            )
            # デバッグ用---------------------------------------------------------------
            flash(email + 'にURLを送信しました。URLをクリックするとメールアドレスの登録が完了します。')
        elif pass_f == 1:
            flash('更新に成功しました')
        else:
            flash('変更するメールアドレスまたはパスワードを入力してください')
    return render_template('mypage/mail_password.html', form=form)