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 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('メールアドレスはすでに登録されています。')
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)
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 )
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 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('メールアドレスはすでに登録されています')
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 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)
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 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 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 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 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)
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)
def validate_usercode(self, field): if current_user.user_code != field.data and User.select_user_by_user_code( field.data): raise ValidationError('ユーザーコードはすでに使用されています。')
def validate_user_code(self, field): if User.select_user_by_user_code(field.data): raise ValidationError('このユーザーコードはすでに使用されています')
def validate_email(self, field): if not User.select_user_by_email(field.data): raise ValidationError('そのメールアドレスは存在しません')
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)