70 lines
3.0 KiB
Python
70 lines
3.0 KiB
Python
"""学员课时账户:手动调整(管理员)"""
|
|
from flask import render_template, request, redirect, url_for, flash, session
|
|
from models import db, Student, Course, StudentAccount
|
|
from utils import login_required, permission_required, log_operation
|
|
import business_rules as rules
|
|
|
|
|
|
def register_routes(app):
|
|
|
|
@app.route('/accounts/adjust', methods=['GET', 'POST'], endpoint='account_adjust')
|
|
@login_required
|
|
@permission_required('student_account_adjust')
|
|
def account_adjust():
|
|
if request.method == 'POST':
|
|
student_id = int(request.form.get('student_id'))
|
|
course_id = int(request.form.get('course_id'))
|
|
try:
|
|
normal_delta = float(request.form.get('normal_delta', 0) or 0)
|
|
gifted_delta = float(request.form.get('gifted_delta', 0) or 0)
|
|
except ValueError:
|
|
flash('课时调整值格式错误', 'danger')
|
|
return redirect(url_for('account_adjust'))
|
|
|
|
reason = request.form.get('reason', '').strip()
|
|
account = rules.lock_student_account(student_id, course_id)
|
|
if not account:
|
|
account = StudentAccount(student_id=student_id, course_id=course_id)
|
|
db.session.add(account)
|
|
db.session.flush()
|
|
|
|
before = rules.account_snapshot_dict(account)
|
|
try:
|
|
rules.manual_adjust_account(
|
|
account, normal_delta=normal_delta,
|
|
gifted_delta=gifted_delta, reason=reason,
|
|
)
|
|
record = None
|
|
db.session.commit()
|
|
after = rules.account_snapshot_dict(account)
|
|
log_operation(
|
|
'手动调课时',
|
|
f'学员{student_id} 课程{course_id} 正课{normal_delta:+} 赠课{gifted_delta:+} {reason}',
|
|
before=before, after=after, commit=True,
|
|
)
|
|
flash('课时调整成功', 'success')
|
|
return redirect(url_for(
|
|
'account_adjust',
|
|
student_id=student_id, course_id=course_id,
|
|
))
|
|
except ValueError as e:
|
|
db.session.rollback()
|
|
flash(str(e), 'danger')
|
|
|
|
student_id = request.args.get('student_id', type=int)
|
|
course_id = request.args.get('course_id', type=int)
|
|
account = None
|
|
if student_id and course_id:
|
|
account = StudentAccount.query.filter_by(
|
|
student_id=student_id, course_id=course_id,
|
|
).first()
|
|
|
|
students = Student.query.filter_by(status=1).order_by(Student.id.desc()).all()
|
|
courses = Course.query.filter_by(status=1).all()
|
|
return render_template(
|
|
'account_adjust.html',
|
|
students=students, courses=courses,
|
|
account=account,
|
|
student_id=student_id, course_id=course_id,
|
|
)
|