|
|
@ -1,4 +1,4 @@ |
|
|
|
from flask import Flask, request, render_template, send_from_directory, abort, redirect, session |
|
|
|
from flask import Flask, request, render_template, send_from_directory, abort, redirect, session, url_for |
|
|
|
from flask_sqlalchemy import SQLAlchemy |
|
|
|
from flask_limiter import Limiter |
|
|
|
from flask_limiter.util import get_remote_address |
|
|
@ -6,7 +6,8 @@ from flask_limiter.util import get_remote_address |
|
|
|
import ipfshttpclient |
|
|
|
|
|
|
|
from datetime import date, datetime |
|
|
|
from werkzeug.utils import secure_filename |
|
|
|
from functools import wraps |
|
|
|
import hashlib |
|
|
|
import os |
|
|
|
from config import C |
|
|
|
|
|
|
@ -27,21 +28,35 @@ ipfs_client = ipfshttpclient.connect() |
|
|
|
class Paper(db.Model): |
|
|
|
id = db.Column(db.Integer, primary_key=True) |
|
|
|
course = db.Column(db.String(30), index=True) |
|
|
|
teacher = db.Column(db.String(10), index=True) |
|
|
|
teacher = db.Column(db.String(30), index=True) |
|
|
|
year = db.Column(db.Integer, index=True) |
|
|
|
author = db.Column(db.String(30), index=True) |
|
|
|
notes = db.Column(db.String(200)) |
|
|
|
anon = db.Column(db.Boolean) |
|
|
|
create_date = db.Column(db.Date) |
|
|
|
like_num = db.Column(db.Integer, index=True, default=0) |
|
|
|
down_num = db.Column(db.Integer, index=True, default=0) |
|
|
|
file_hash = db.Column(db.String(64)) |
|
|
|
|
|
|
|
db.create_all() |
|
|
|
if __name__ == "__main__": |
|
|
|
db.create_all() |
|
|
|
|
|
|
|
# TODO 登陆 |
|
|
|
def login_required(f): |
|
|
|
@wraps(f) |
|
|
|
def df(*args, **kwargs): |
|
|
|
username = session.get('username') |
|
|
|
if not username or (not C.allow_guest_upload and username.startswith('guest(')): |
|
|
|
return redirect(url_for('login')) |
|
|
|
return f(*args, **kwargs, username=username) |
|
|
|
return df |
|
|
|
|
|
|
|
@app.route('/pastExam/login') |
|
|
|
def login(): |
|
|
|
return app.send_static_file('login.html') |
|
|
|
|
|
|
|
@app.route('/pastExam/') |
|
|
|
def list(): |
|
|
|
@login_required |
|
|
|
def list(username): |
|
|
|
course = request.args.get('course') |
|
|
|
teacher = request.args.get('teacher') |
|
|
|
year = request.args.get('year') |
|
|
@ -67,7 +82,7 @@ def list(): |
|
|
|
all_courses = [i for i, in db.session.query(Paper.course.distinct()).all()] |
|
|
|
all_teachers = [i for i, in db.session.query(Paper.teacher.distinct()).all()] |
|
|
|
all_years = [i for i, in db.session.query(Paper.year.distinct()).all()] |
|
|
|
ipfs_base_url = C.ipfs_base_url |
|
|
|
ipfs_version = hashlib.sha256(C.ipfs_base_url.encode('utf-8')).hexdigest() |
|
|
|
return render_template('list.html', **locals()) |
|
|
|
|
|
|
|
def check_length(x, limit=30, allow_null=False): |
|
|
@ -75,8 +90,8 @@ def check_length(x, limit=30, allow_null=False): |
|
|
|
|
|
|
|
@app.route('/pastExam/upload', methods=['POST']) |
|
|
|
@limiter.limit("10 / hour") |
|
|
|
def upload(): |
|
|
|
username = 'guest' # TODO |
|
|
|
@login_required |
|
|
|
def upload(username): |
|
|
|
name = request.form.get('name') |
|
|
|
teacher = request.form.get('teacher') |
|
|
|
year = request.form.get('year') |
|
|
@ -84,7 +99,7 @@ def upload(): |
|
|
|
notes = request.form.get('notes', '') |
|
|
|
anon = request.form.get('anon') == 'on' |
|
|
|
|
|
|
|
if not (check_length(name) and check_length(teacher, 10) and check_length(notes, 200, True)): |
|
|
|
if not (check_length(name) and check_length(teacher) and check_length(notes, 200, True)): |
|
|
|
abort(422) |
|
|
|
|
|
|
|
files = request.files.getlist('files[]') |
|
|
@ -120,3 +135,10 @@ def upload(): |
|
|
|
|
|
|
|
return redirect('.#part2') |
|
|
|
|
|
|
|
@app.route('/pastExam/<pid>/download') |
|
|
|
@login_required |
|
|
|
def download(pid, username): |
|
|
|
p = Paper.query.get_or_404(pid) |
|
|
|
# TODO: download number |
|
|
|
return redirect(C.ipfs_base_url + p.file_hash, code=301) # 301减少不必要的请求 |
|
|
|
|