Exemple #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
Exemple #2
0
 def validate_email(self, field):
     if User.select_user_by_email(field.data):
         raise ValidationError('メールアドレスはすでに登録されています。')
     if UserTempToken.email_exists(field.data):
         raise ValidationError('メールアドレスはすでに登録されています。')
     if MailResetToken.email_exists(field.data):
         raise ValidationError('メールアドレスはすでに登録されています。')
Exemple #3
0
def forgot_password():
    form = ForgotPasswordForm(request.form)
    if request.method == 'POST' and form.validate():
        email = form.email.data
        # emailによってユーザーを絞り込みUserテーブルのデータを取得
        user = User.select_user_by_email(email)
        # ユーザーが存在する場合パスワードのトークンを発行する
        if user:
            #パスワードリセットトークン情報テーブルにレコードの挿入
            with db.session.begin(subtransactions=True):
                token = PasswordResetToken.publish_token(user)
            db.session.commit()
            # メール送信処理ここから----------------------------------------------------------
            msg = Message('古書邂逅 パスワード再設定メール', recipients=[user.email])
            msg.html = '<hr>【古書邂逅】 パスワード再設定のご案内<hr>\
                        いつも古書邂逅をご利用頂き、誠にありがとうございます。<br>\
                        パスワード変更のリクエストを受け付けました。<br>\
                        下記ページアドレス(URL)をクリックしてパスワードの再設定を行ってください。<br>\
                        再設定を行うまではパスワードは変更されません。<br>\
                        <br><br>\
                        【こちらをクリックしてパスワードの再設定を行ってください】<br>\
                        {url}'.format(url=url_for(
                'auth.reset_password', token=token, _external=True))
            mail.send(msg)
            # メール送信処理ここまで----------------------------------------------------------
            # デバッグ用---------------------------------------------------------------
            print(
                f'パスワード再設定用URL: http://127.0.0.1:5000/auth/reset_password/{token}'
            )
            # デバッグ用---------------------------------------------------------------
            flash('パスワード再登録用のURLを発行しました。')
            return redirect(url_for('auth.login'))
        else:
            flash('存在しないユーザです。')
    return render_template('auth/forgot_password.html', form=form)
Exemple #4
0
def userdata(user_code):
    user = User.select_user_by_user_code(user_code)
    if user is None:
        return redirect(url_for('route.home'))
    follows = UserConnect.select_follows_by_user_id(user.User_id)
    good_ratings_count,bad_ratings_count = Rating.select_rate_by_user_id(user.User_id)
    # ユーザーが出品した商品
    items = Sell.select_sell_by_user_id_sort(user.User_id)
    # レコメンドリスト
    if current_user.is_authenticated:
        r_user_list = u_recommend(user.User_id,current_user.User_id)
    else:
        r_user_list = u_recommend(user.User_id)
    # ログイン中のユーザーがユーザーをフォローしているかの判定
    f_users = []
    f_users.append(user)
    f_users.extend(r_user_list)
    followed_list = []
    if current_user.is_authenticated:
        for f_user in f_users:
            followed = UserConnect.followed_exists(f_user.User_id)
            if followed:
                followed_list.append(f_user.User_id)
    # ログイン中のユーザーが過去にどの商品をいいねしたかを格納しておく
    liked_list = []
    if current_user.is_authenticated:
        for item in items:
            liked = Likes.liked_exists(item.Sell_id)
            if liked:
                liked_list.append(item.Sell_id)
    return render_template(
        'user/userdata.html', user=user, followed_list=followed_list, follows_count=len(follows),
        good_ratings_count=good_ratings_count, bad_ratings_count=bad_ratings_count,
        items=items, liked_list=liked_list, post_c=len(items), r_user_list=r_user_list
    )
Exemple #5
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
    )
Exemple #6
0
 def validate_email(self, field):
     user = User.select_user_by_email(self.email.data)
     if user and user.User_id != int(current_user.get_id()):
         raise ValidationError('メールアドレスはすでに登録されています')
     if UserTempToken.email_exists(field.data):
         raise ValidationError('メールアドレスはすでに登録されています')
     if MailResetToken.email_exists(field.data):
         raise ValidationError('メールアドレスはすでに登録されています')
Exemple #7
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))
Exemple #8
0
def user():
    form = SearchForm(request.args, meta={'csrf': False})
    items = None
    users = None
    change_search = 'user'
    # レコメンドリスト
    r_item_list = []
    r_user_list = []
    if current_user.is_authenticated:
        r_item_list,r_user_list = recommend(current_user.User_id)
    if request.method == 'GET':
        if form.submit.data:
            users = User.user_search_by_word(form.search.data)
    return render_template('search/search.html', form=form, items=items, users=users, change_search=change_search, r_user_list=r_user_list)
Exemple #9
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')
Exemple #10
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)
Exemple #11
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)
Exemple #12
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)
Exemple #13
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
Exemple #14
0
def login():
    form = LoginForm(request.form)
    if request.method == 'POST' and form.validate():
        user = User.select_user_by_email(form.email.data)
        # ユーザーが存在するかつ、ユーザーのis_activeがTrue(有効)かつ、ユーザーが入力したパスワードがユーザーのパスワードと一致する
        if user and user.is_active and user.validate_password(
                form.password.data):
            # ユーザーをログインさせる remember:セッションの期限が切れた後にユーザーを記憶する(ログインが維持される)
            login_user(user, remember=True)
            # request.args.get();GETリクエストで引数を受け取る
            next = request.args.get('next')
            if not next:
                next = url_for('route.home')
            return redirect(next)
        # ユーザーが存在しない
        elif not user:
            flash('存在しないユーザです')
        # ユーザーが有効でない
        elif not user.is_active:
            flash('無効なユーザです。パスワードを再設定してください')
        # パスワードが違う
        elif not user.validate_password(form.password.data):
            flash('メールアドレスとパスワードの組み合わせが誤っています')
    return render_template('auth/login.html', form=form)
Exemple #15
0
def userregister(token):
    form = RegisterForm(request.form)
    form.b_year.choices += [
        (i, i) for i in reversed(range(1900,
                                       datetime.date.today().year + 1))
    ]
    form.b_month.choices += [(i, i) for i in range(1, 13)]
    form.b_date.choices += [(i, i) for i in range(1, 32)]
    email = UserTempToken.get_email_by_token(token)
    if not email:
        return redirect(url_for('route.home'))
    if request.method == 'POST' and form.validate():
        # Userインスタンス作成
        user = User(user_code=form.user_code.data,
                    username=form.username.data,
                    email=email)
        user.password = form.password.data
        # データベース登録処理
        with db.session.begin(subtransactions=True):
            #Userテーブルにレコードの挿入
            User.create_new_user(user)
        db.session.commit()
        # 画像アップロード処理 ここから-------------------------------------------------
        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('auth.userregister', token=token))
        # 画像アップロード処理 ここまで--------------------------------------------------
        userinfo = UserInfo(User_id=user.User_id,
                            last_name=form.last_name.data,
                            first_name=form.first_name.data,
                            last_name_kana=form.last_name_kana.data,
                            first_name_kana=form.first_name_kana.data,
                            birth=datetime.date(form.b_year.data,
                                                form.b_month.data,
                                                form.b_date.data))
        address = Address(User_id=user.User_id,
                          zip_code=form.zip01.data,
                          prefecture=form.pref01.data,
                          address1=form.addr01.data,
                          address2=form.addr02.data,
                          address3=form.addr03.data)
        with db.session.begin(subtransactions=True):
            # UserInfoテーブルにレコードの挿入
            userinfo.create_new_userinfo()
            # Adressテーブルにレコードの挿入
            address.create_new_useraddress()
            #TODO: コメントアウトをけしてください
            if imagename:
                user.picture_path = imagename
            #TODO: トークンレコード削除を削除するクラスメソッドを以下に追加してください
            UserTempToken.delete_token(token)
        db.session.commit()
        flash('新規会員登録が完了しました。')
        login_user(user, remember=True)
        return redirect(url_for('route.home'))
    return render_template('auth/register.html', form=form)
Exemple #16
0
 def validate_usercode(self, field):
     if current_user.user_code != field.data and User.select_user_by_user_code(
             field.data):
         raise ValidationError('ユーザーコードはすでに使用されています。')
Exemple #17
0
 def validate_user_code(self, field):
     if User.select_user_by_user_code(field.data):
         raise ValidationError('このユーザーコードはすでに使用されています')
Exemple #18
0
 def validate_email(self, field):
     if not User.select_user_by_email(field.data):
         raise ValidationError('そのメールアドレスは存在しません')
Exemple #19
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)
Exemple #20
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)