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
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 )
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))
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')
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)
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)
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)
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
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)
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)