119 lines
3.5 KiB
Python
119 lines
3.5 KiB
Python
|
from flask import *
|
||
|
from model import *
|
||
|
from pony.orm import *
|
||
|
from Yaml import yml
|
||
|
from Login import md5
|
||
|
from datetime import datetime
|
||
|
|
||
|
# ? from difficulty import text_difficulty_level
|
||
|
|
||
|
ADMIN_NAME = "114514" # unique admin name
|
||
|
_cur_page = 1 # current article page
|
||
|
_page_size = 5 # article sizes per page
|
||
|
adminService = Blueprint("admin_service", __name__)
|
||
|
|
||
|
|
||
|
@adminService.route("/admin", methods=["GET", "POST"])
|
||
|
def admin():
|
||
|
global _cur_page, _page_size
|
||
|
# 未登录,跳转到未登录界面
|
||
|
if not session.get("logged_in"):
|
||
|
return render_template("not_login.html")
|
||
|
|
||
|
# 获取session里的用户名
|
||
|
username = session.get("username")
|
||
|
if username != ADMIN_NAME:
|
||
|
return "You are not admin!"
|
||
|
|
||
|
article_len = get_articles_len()
|
||
|
try:
|
||
|
_page_size = min(int(request.args.get("size", 5)), article_len)
|
||
|
if _page_size <= 0:
|
||
|
raise ZeroDivisionError
|
||
|
_cur_page = min(int(request.args.get("page", 1)), article_len // _page_size)
|
||
|
except ValueError:
|
||
|
return "page parmas must be int!"
|
||
|
except ZeroDivisionError:
|
||
|
return "page size must bigger than zero"
|
||
|
|
||
|
context = {
|
||
|
"text_len": article_len,
|
||
|
"page_size": _page_size,
|
||
|
"cur_page": _cur_page,
|
||
|
"text_list": get_page_articles(_cur_page, _page_size),
|
||
|
"user_list": get_users(),
|
||
|
"username": username,
|
||
|
"yml": yml,
|
||
|
}
|
||
|
|
||
|
def _update_context():
|
||
|
article_len = get_articles_len()
|
||
|
context["text_len"] = article_len
|
||
|
context["text_list"] = get_page_articles(_cur_page, _page_size)
|
||
|
|
||
|
if request.method == "GET":
|
||
|
if delete_id := int(request.args.get("delete_id", 0)): # delete article
|
||
|
delete_article(delete_id)
|
||
|
_update_context()
|
||
|
else:
|
||
|
data = request.form
|
||
|
content = data.get("content", "")
|
||
|
source = data.get("source", "")
|
||
|
question = data.get("question", "")
|
||
|
username = data.get("username", "")
|
||
|
if content:
|
||
|
add_article(content, source, question)
|
||
|
_update_context()
|
||
|
if username:
|
||
|
update_user_password(username)
|
||
|
|
||
|
return render_template("admin_index.html", **context)
|
||
|
|
||
|
|
||
|
def add_article(content, source="manual_input", question="No question"):
|
||
|
with db_session:
|
||
|
# add one atricle to sqlite
|
||
|
Article(
|
||
|
text=content,
|
||
|
source=source,
|
||
|
date=datetime.now().strftime("%-d %b %Y"), # format style of `5 Oct 2022`
|
||
|
level="1",
|
||
|
question=question,
|
||
|
)
|
||
|
# ? There is a question that:
|
||
|
# ? How can i get one article level?
|
||
|
# ? I try to use the function `text_difficulty_level(content,{"test":1})`
|
||
|
# ? However, i lose one dict parma from pickle
|
||
|
# ? So I temporarily fixed the level to 1
|
||
|
|
||
|
|
||
|
def delete_article(article_id):
|
||
|
article_id &= 0xFFFFFFFF # max 32 bits
|
||
|
with db_session:
|
||
|
if article := Article.select(article_id=article_id):
|
||
|
article.first().delete()
|
||
|
|
||
|
|
||
|
def get_articles_len():
|
||
|
with db_session:
|
||
|
return len(Article.select()[:])
|
||
|
|
||
|
|
||
|
def get_page_articles(num, size):
|
||
|
with db_session:
|
||
|
return [
|
||
|
x
|
||
|
for x in Article.select().order_by(desc(Article.article_id)).page(num, size)
|
||
|
]
|
||
|
|
||
|
|
||
|
def get_users():
|
||
|
with db_session:
|
||
|
return User.select()[:]
|
||
|
|
||
|
|
||
|
def update_user_password(username, password="123456"):
|
||
|
with db_session:
|
||
|
if user := User.select(name=username).first():
|
||
|
user.password = md5(username + password)
|