forked from mrlan/EnglishPal
213 lines
9.0 KiB
Python
213 lines
9.0 KiB
Python
from datetime import datetime
|
||
from admin_service import ADMIN_NAME
|
||
from flask import *
|
||
|
||
# from app import Yaml
|
||
# from app.Article import get_today_article, load_freq_history
|
||
# from app.WordFreq import WordFreq
|
||
# from app.wordfreqCMD import sort_in_descending_order
|
||
|
||
import Yaml
|
||
from Article import get_today_article, load_freq_history
|
||
from WordFreq import WordFreq
|
||
from wordfreqCMD import sort_in_descending_order
|
||
|
||
import pickle_idea
|
||
import pickle_idea2
|
||
|
||
import logging
|
||
logging.basicConfig(filename='log.txt', format='%(asctime)s %(message)s', level=logging.DEBUG)
|
||
|
||
# 初始化蓝图
|
||
userService = Blueprint("user_bp", __name__)
|
||
|
||
path_prefix = '/var/www/wordfreq/wordfreq/'
|
||
path_prefix = './' # comment this line in deployment
|
||
|
||
@userService.route("/get_next_article/<username>",methods=['GET','POST'])
|
||
def get_next_article(username):
|
||
user_freq_record = path_prefix + 'static/frequency/' + 'frequency_%s.pickle' % (username)
|
||
session['old_articleID'] = session.get('articleID')
|
||
if request.method == 'GET':
|
||
visited_articles = session.get("visited_articles")
|
||
if visited_articles['article_ids'][-1] == "null": # 如果当前还是“null”,则将“null”pop出来,无需index+=1
|
||
visited_articles['article_ids'].pop()
|
||
else: # 当前不为“null”,直接 index+=1
|
||
visited_articles["index"] += 1
|
||
session["visited_articles"] = visited_articles
|
||
logging.debug('/get_next_article: start calling get_today_arcile()')
|
||
visited_articles, today_article, result_of_generate_article = get_today_article(user_freq_record, session.get('visited_articles'))
|
||
logging.debug('/get_next_arcile: done.')
|
||
data = {
|
||
'visited_articles': visited_articles,
|
||
'today_article': today_article,
|
||
'result_of_generate_article': result_of_generate_article
|
||
}
|
||
else:
|
||
return 'Under construction'
|
||
return json.dumps(data)
|
||
|
||
@userService.route("/get_pre_article/<username>",methods=['GET'])
|
||
def get_pre_article(username):
|
||
user_freq_record = path_prefix + 'static/frequency/' + 'frequency_%s.pickle' % (username)
|
||
if request.method == 'GET':
|
||
visited_articles = session.get("visited_articles")
|
||
if(visited_articles["index"]==0):
|
||
data=''
|
||
else:
|
||
visited_articles["index"] -= 1 # 上一篇,index-=1
|
||
if visited_articles['article_ids'][-1] == "null": # 如果当前还是“null”,则将“null”pop出来
|
||
visited_articles['article_ids'].pop()
|
||
session["visited_articles"] = visited_articles
|
||
visited_articles, today_article, result_of_generate_article = get_today_article(user_freq_record, session.get('visited_articles'))
|
||
data = {
|
||
'visited_articles': visited_articles,
|
||
'today_article': today_article,
|
||
'result_of_generate_article':result_of_generate_article
|
||
}
|
||
return json.dumps(data)
|
||
|
||
@userService.route("/<username>/<word>/unfamiliar", methods=['GET', 'POST'])
|
||
def unfamiliar(username, word):
|
||
'''
|
||
|
||
:param username:
|
||
:param word:
|
||
:return:
|
||
'''
|
||
user_freq_record = path_prefix + 'static/frequency/' + 'frequency_%s.pickle' % (username)
|
||
pickle_idea.unfamiliar(user_freq_record, word)
|
||
session['thisWord'] = word # 1. put a word into session
|
||
session['time'] = 1
|
||
return "success"
|
||
|
||
|
||
@userService.route("/<username>/<word>/familiar", methods=['GET', 'POST'])
|
||
def familiar(username, word):
|
||
'''
|
||
|
||
:param username:
|
||
:param word:
|
||
:return:
|
||
'''
|
||
user_freq_record = path_prefix + 'static/frequency/' + 'frequency_%s.pickle' % (username)
|
||
pickle_idea.familiar(user_freq_record, word)
|
||
session['thisWord'] = word # 1. put a word into session
|
||
session['time'] = 1
|
||
return "success"
|
||
|
||
|
||
@userService.route("/<username>/<word>/del", methods=['GET', 'POST'])
|
||
def deleteword(username, word):
|
||
'''
|
||
删除单词
|
||
:param username: 用户名
|
||
:param word: 单词
|
||
:return: 重定位到用户界面
|
||
'''
|
||
user_freq_record = path_prefix + 'static/frequency/' + 'frequency_%s.pickle' % (username)
|
||
pickle_idea2.deleteRecord(user_freq_record, word)
|
||
# 模板userpage_get.html中删除单词是异步执行,而flash的信息后续是同步执行的,所以注释这段代码;同时如果这里使用flash但不提取信息,则会影响 signup.html的显示。bug复现:删除单词后,点击退出,点击注册,注册页面就会出现提示信息
|
||
# flash(f'{word} is no longer in your word list.')
|
||
return "success"
|
||
|
||
|
||
@userService.route("/<username>/userpage", methods=['GET', 'POST'])
|
||
def userpage(username):
|
||
'''
|
||
用户界面
|
||
:param username: 用户名
|
||
:return: 返回用户界面
|
||
'''
|
||
# 未登录,跳转到未登录界面
|
||
if not session.get('logged_in'):
|
||
return render_template('not_login.html')
|
||
|
||
# 用户过期
|
||
user_expiry_date = session.get('expiry_date')
|
||
if datetime.now().strftime('%Y%m%d') > user_expiry_date:
|
||
return render_template('expiry.html', expiry_date=user_expiry_date)
|
||
|
||
# 获取session里的用户名
|
||
username = session.get('username')
|
||
|
||
user_freq_record = path_prefix + 'static/frequency/' + 'frequency_%s.pickle' % (username)
|
||
|
||
if request.method == 'POST': # when we submit a form
|
||
content = request.form['content']
|
||
f = WordFreq(content)
|
||
lst = f.get_freq()
|
||
return render_template('userpage_post.html',username=username,lst = lst, yml=Yaml.yml)
|
||
|
||
elif request.method == 'GET': # when we load a html page
|
||
d = load_freq_history(user_freq_record)
|
||
lst = pickle_idea2.dict2lst(d)
|
||
lst2 = []
|
||
for t in lst:
|
||
lst2.append((t[0], len(t[1])))
|
||
lst3 = sort_in_descending_order(lst2)
|
||
words = ''
|
||
for x in lst3:
|
||
words += x[0] + ' '
|
||
visited_articles, today_article, result_of_generate_article = get_today_article(user_freq_record, session.get('visited_articles'))
|
||
session['visited_articles'] = visited_articles
|
||
# 通过 today_article,加载前端的显示页面
|
||
return render_template('userpage_get.html',
|
||
admin_name=ADMIN_NAME,
|
||
username=username,
|
||
session=session,
|
||
# flashed_messages=get_flashed_messages(), 仅有删除单词的时候使用到flash,而删除单词是异步执行,这里的信息提示是同步执行,所以就没有存在的必要了
|
||
today_article=today_article,
|
||
result_of_generate_article=result_of_generate_article,
|
||
d_len=len(d),
|
||
lst3=lst3,
|
||
yml=Yaml.yml,
|
||
words=words)
|
||
|
||
@userService.route("/<username>/mark", methods=['GET', 'POST'])
|
||
def user_mark_word(username):
|
||
'''
|
||
标记单词
|
||
:param username: 用户名
|
||
:return: 重定位到用户界面
|
||
'''
|
||
username = session[username]
|
||
user_freq_record = path_prefix + 'static/frequency/' + 'frequency_%s.pickle' % (username)
|
||
if request.method == 'POST':
|
||
# 提交标记的单词
|
||
d = load_freq_history(user_freq_record)
|
||
lst_history = pickle_idea2.dict2lst(d)
|
||
lst = []
|
||
# pickle_idea2.save_frequency_to_pickle中设置的较为简单的无法加入生词簿的单词,虽然生词簿未添加但添加后顶部依然会显示"Added ***"的信息
|
||
exclusion_lst = ['one', 'no', 'has', 'had', 'do', 'that', 'have', 'by', 'not', 'but', 'we', 'this', 'my',
|
||
'him', 'so', 'or', 'as', 'are', 'it', 'from', 'with', 'be', 'can', 'for', 'an', 'if',
|
||
'who', 'whom', 'whose', 'which', 'the', 'to', 'a', 'of', 'and', 'you', 'i', 'he', 'she',
|
||
'they', 'me', 'was', 'were', 'is', 'in', 'at', 'on', 'their', 'his', 'her', 's', 'said',
|
||
'all', 'did', 'been', 'w']
|
||
add = request.form.getlist('marked')
|
||
trueadd = []
|
||
for word in add:
|
||
if word not in exclusion_lst:
|
||
trueadd.append(word)
|
||
lst.append((word, [get_time()]))
|
||
if len(trueadd) > 0: # 如果有单词被添加
|
||
d = pickle_idea2.merge_frequency(lst, lst_history)
|
||
if len(lst_history) > 999:
|
||
flash('You have way too many words in your difficult-words book. Delete some first.')
|
||
else:
|
||
pickle_idea2.save_frequency_to_pickle(d, user_freq_record)
|
||
flash('Added %s.' % (', '.join(trueadd))) # 显示添加的单词
|
||
else:
|
||
flash('No new words were added. All words were either too simple or already in your list.') # 没有单词被添加
|
||
return redirect(url_for('user_bp.userpage', username=username))
|
||
else:
|
||
return 'Under construction'
|
||
|
||
def get_time():
|
||
'''
|
||
获取当前时间
|
||
:return: 当前时间
|
||
'''
|
||
return datetime.now().strftime('%Y%m%d%H%M') # upper to minutes
|
||
|