From 7e621848cb1fce68364378a01d32d0033abfcf13 Mon Sep 17 00:00:00 2001 From: Aaron Lee Date: Sun, 26 Dec 2021 21:08:50 +0800 Subject: [PATCH] Added 2-step-ds; Export --- .gitignore | 3 +- app.py | 5 +- export.py | 333 +++++++++++++++++++++ login.py | 1 - manage/__pycache__/admin.cpython-39.pyc | Bin 0 -> 5406 bytes manage/__pycache__/group.cpython-39.pyc | Bin 0 -> 3418 bytes manage/__pycache__/homeroom.cpython-39.pyc | Bin 0 -> 4541 bytes manage/__pycache__/manage.cpython-39.pyc | Bin 0 -> 8567 bytes manage/__pycache__/student.cpython-39.pyc | Bin 0 -> 1620 bytes manage/admin.py | 139 +++++++++ manage/group.py | 102 +++++++ manage/homeroom.py | 141 +++++++++ manage.py => manage/manage.py | 290 ++---------------- manage/student.py | 30 ++ static/old_favicon.ico | Bin 225530 -> 0 bytes static/pagejs/admin.js | 49 ++- static/pagejs/group_teach.js | 28 +- static/pagejs/homeroom.js | 20 +- temp/placeholderfile.txt | 1 - templates/admin.html | 141 ++++----- templates/admin_export.html | 92 ++++++ templates/admin_mark.html | 178 +++++++++++ templates/group_teach.html | 70 ++++- templates/homeroom.html | 115 ++++--- templates/list.html | 2 +- templates/sidebar.html | 10 +- 26 files changed, 1324 insertions(+), 426 deletions(-) create mode 100644 export.py create mode 100644 manage/__pycache__/admin.cpython-39.pyc create mode 100644 manage/__pycache__/group.cpython-39.pyc create mode 100644 manage/__pycache__/homeroom.cpython-39.pyc create mode 100644 manage/__pycache__/manage.cpython-39.pyc create mode 100644 manage/__pycache__/student.cpython-39.pyc create mode 100644 manage/admin.py create mode 100644 manage/group.py create mode 100644 manage/homeroom.py rename manage.py => manage/manage.py (60%) create mode 100644 manage/student.py delete mode 100644 static/old_favicon.ico delete mode 100644 temp/placeholderfile.txt create mode 100644 templates/admin_export.html create mode 100644 templates/admin_mark.html diff --git a/.gitignore b/.gitignore index 8ed1e58..4591ab2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *.DS_Store *.env test*.* -__pycache__/* \ No newline at end of file +__pycache__/* +excel/* \ No newline at end of file diff --git a/app.py b/app.py index 8349ebd..4104c90 100644 --- a/app.py +++ b/app.py @@ -1,5 +1,5 @@ from functions import * -from manage import manage +from manage.manage import manage from upload import upload from login import login load_dotenv() @@ -20,6 +20,7 @@ class DefaultModelView(ModelView): restricted = True def __init__(self, model, session, restricted=True, name=None, category=None, endpoint=None, url=None, **kwargs): self.restricted = restricted + self.column_default_sort = ('id', True) for k, v in kwargs.items(): setattr(self, k, v) setattr(self, 'can_export', True) @@ -145,4 +146,4 @@ admin.add_link(MenuLink(name='Back to Home 返回一般管理', category='', url admin.add_link(MenuLink(name='Logout 登出', category='', url='/logout')) if __name__ == '__main__': - app.run(debug=True, host='0.0.0.0', port=5000) + app.run(debug=True, host='0.0.0.0', port=5050) diff --git a/export.py b/export.py new file mode 100644 index 0000000..facb606 --- /dev/null +++ b/export.py @@ -0,0 +1,333 @@ +from functions import * +from openpyxl import Workbook +from openpyxl.styles import Font, Alignment, Border, Side +import io + +center = Alignment(horizontal="center", vertical="center") +std_font = Font(name="Calibri", size=13) +side = Side(border_style='thin') +border = Border(left=side, right=side, top=side, bottom=side) +bold_bottom = Border(left=side, right=side, top=side, bottom=Side(border_style='medium', color='FF000000')) + +def create_period_sheets(workbook, class_code): + ws = workbook.create_sheet(class_code[0] + class_code[1]) + ws.merge_cells('A1:F1') + ws['A1'] = '台北市私立復興實驗高級中學班級課表' + ws['A1'].font = Font(name="DFKai-SB", size=15, bold=True) + ws['A1'].alignment = center + # loop over A:F + for i in range(0, 6): + ws[str(chr(ord('A') + i)) + '1'].border = border + ws['G1'] = class_code[0] + class_code[1] + ws['G1'].font = Font(name='Courier New', size=20, bold=True) + ws['G1'].alignment = center + ws['G1'].border = border + + ws.row_dimensions[1].height = 40 + ws.row_dimensions[2].height = 25 + ws.column_dimensions['A'].width = 3 + ws.column_dimensions['B'].width = 10 + + ws.merge_cells('A2:B2') + ws['A2'] = '時間' + ws['C2'] = '星期一' + ws['D2'] = '星期二' + ws['E2'] = '星期三' + ws['F2'] = '星期四' + ws['G2'] = '星期五' + + # loop over A2:G2 + for i in range(1, 8): + ws.cell(row=2, column=i).font = Font(size=14, bold=True) + ws.cell(row=2, column=i).alignment = center + ws.cell(row=2, column=i).border = border + + # loop over C:G + for i in range(2, 8): + ws.column_dimensions[str(chr(ord('A') + i))].width = 13 + + # get data + db = refresh_db() + cursor = db.cursor() + cursor.execute("SELECT dow,period,subject,teacher FROM schedule WHERE grade=%s AND class_=%s", (class_code[0], class_code[1])) + sql = cursor.fetchall() + data = {} + subject_teacher = {} + # loop over data + for i in sql: + if i[0] not in data: + data[i[0]] = {} + data[i[0]][i[1]] = { + 'subject': i[2], + 'teacher': i[3] + } + if i[2] != 'GP' and i[2] != '--' and i[3] != '--' and i[2] not in subject_teacher: + subject_teacher[i[2]] = i[3] + + periods=['m', '1', '2', '3', '4', 'n', '5', '6', '7', '8', '9'] + times = { + 'm': ['7:30', '8:10'], + '1': ['8:20', '9:05'], + '2': ['9:15', '10:00'], + '3': ['10:10', '10:55'], + '4': ['11:05', '11:50'], + 'n': ['11:50', '13:05'], + '5': ['13:15', '14:00'], + '6': ['14:10', '14:55'], + '7': ['15:05', '15:50'], + '8': ['15:55', '16:40'], + '9': ['16:45', '17:30'] + } + curr = 3 + for p in periods: + ws.merge_cells('A' + str(curr) + ':A' + str(curr + 1)) + ws.row_dimensions[curr].height = 20 + ws.row_dimensions[curr + 1].height = 20 + ws['A' + str(curr)] = p + ws['A' + str(curr)].font = std_font + ws['A' + str(curr)].alignment = center + ws['A' + str(curr)].border = border + ws['A' + str(curr + 1)].border = border + ws['B' + str(curr)] = times[p][0] + ws['B' + str(curr)].font = std_font + ws['B' + str(curr)].alignment = center + ws['B' + str(curr)].border = border + ws['B' + str(curr + 1)] = times[p][1] + ws['B' + str(curr + 1)].font = std_font + ws['B' + str(curr + 1)].alignment = center + ws['B' + str(curr + 1)].border = border + + if p == 'm' or p == 'n': + ws.merge_cells('C' + str(curr) + ':G' + str(curr + 1)) + for i in range(1, 6): + ws[chr(ord('C') + i-1) + str(curr)].font = std_font + ws[chr(ord('C') + i-1) + str(curr)].alignment = center + ws[chr(ord('C') + i-1) + str(curr)].border = border + ws[chr(ord('C') + i-1) + str(curr + 1)].border = border + if p == 'm': + ws['C' + str(curr)] = '早自習' + else: + ws['C' + str(curr)] = '午餐 / 午休' + else: + for i in range(1, 6): + ws.merge_cells(chr(ord('C') + i-1) + str(curr) + ':' + chr(ord('C') + i-1) + str(curr + 1)) + ws[chr(ord('C') + i-1) + str(curr)].font = std_font + ws[chr(ord('C') + i-1) + str(curr)].alignment = center + ws[chr(ord('C') + i-1) + str(curr)].border = border + ws[chr(ord('C') + i-1) + str(curr + 1)].border = border + if i in data: + if p in data[i]: + ws[chr(ord('C') + i-1) + str(curr)] = (data[i][p]['subject'] if data[i][p]['subject'] != 'GP' + and data[i][p]['subject'] != '--' else '' if data[i][p]['subject'] == '--' else data[i][p]['teacher']) + curr += 2 + ws.merge_cells('A26:G26') + ws['A26'] = '科任老師一覽表' + ws['A26'].font = Font(size=14, bold=True) + ws['A26'].alignment = center + ws.row_dimensions[26].height = 20 + # loop over A26:G26 + for i in range(0, 7): + ws[chr(ord('A') + i) + '26'].border = border + curr = 0 + for i in subject_teacher: + if (curr % 3) == 0: + pos = ['A', 'C'] + elif (curr % 3) == 1: + pos = ['D', 'E'] + else: + pos = ['F', 'G'] + loc = str(27+ int(curr/3)) + ws.merge_cells(pos[0] + loc + ':' + pos[1] + loc) + ws[pos[0] + loc].font = std_font + ws[pos[0] + loc].alignment = center + ws[pos[0] + loc].border = border + ws[pos[0] + loc] = i + ': ' + subject_teacher[i] + for j in range(ord(pos[0]), ord(pos[1]) + 1): + ws[chr(j) + loc].border = border + ws.row_dimensions[curr + 27].height = 20 + curr += 1 + return workbook + +def create_student_list(workbook, class_code): + ws = workbook.create_sheet(class_code[0] + class_code[1]) + ws.merge_cells('A1:J1') + ws['A1'] = '台北市私立復興實驗高級中學學生名單' + ws['A1'].font = Font(name="DFKai-SB", size=15, bold=True) + ws['A1'].alignment = center + # loop over A:J + for i in range(0, 11): + ws[str(chr(ord('A') + i)) + '1'].border = border + ws.merge_cells('K1:L1') + ws['K1'] = class_code[0] + class_code[1] + ws['K1'].font = Font(name='Courier New', size=20, bold=True) + ws['K1'].alignment = center + ws['K1'].border = border + ws['L1'].border = border + ws.column_dimensions['A'].width = 5 + ws.column_dimensions['B'].width = 11 + ws.column_dimensions['C'].width = 12 + ws.row_dimensions[1].height = 25 + ws.row_dimensions[2].height = 20 + + ws['A2'] = '#' + ws['A2'].font = Font(name="Calibri", size=13, bold=True) + ws['A2'].alignment = center + ws['A2'].border = bold_bottom + ws['B2'] = '姓名' + ws['B2'].font = Font(name="DFKai-SB", size=13, bold=True) + ws['B2'].alignment = center + ws['B2'].border = bold_bottom + ws['C2'] = 'Name' + ws['C2'].font = Font(name="Calibri", size=13, bold=True) + ws['C2'].alignment = center + ws['C2'].border = bold_bottom + for i in range(3, 12): + ws[str(chr(ord('A') + i)) + '2'].border = bold_bottom + ws.column_dimensions[str(chr(ord('A') + i))].width = 5.8 + db = refresh_db() + cursor = db.cursor() + cursor.execute('SELECT num,name,ename FROM students WHERE grade=%s AND class_=%s ORDER BY num ASC', (class_code[0], class_code[1])) + data = cursor.fetchall() + last = data[-1][0] + delcnt = 0 + for i in range(0, last): + ws['A' + str(3 + i)] = i+1 + ws['A' + str(3 + i)].font = std_font + ws['A' + str(3 + i)].alignment = center + ws['B' + str(3 + i)] = data[i - delcnt][1] if data[i - delcnt][0] == i+1 else '' + ws['B' + str(3 + i)].font = Font(name="DFKai-SB", size=14) + ws['B' + str(3 + i)].alignment = center + ws['C' + str(3 + i)] = data[i - delcnt][2] if data[i - delcnt][0] == i+1 else '' + ws['C' + str(3 + i)].font = std_font + ws['C' + str(3 + i)].alignment = center + ws.row_dimensions[3 + i].height = 19 + for j in range(0, 12): + ws[str(chr(ord('A') + j)) + str(3 + i)].border = bold_bottom if (i+1)%5==0 else border + if data[i - delcnt][0] != i+1: + delcnt += 1 + return workbook + +def create_teacher_periods(workbook, teacher_name, orig_username=''): + ws = workbook.create_sheet(teacher_name) + ws.merge_cells('A1:E1') + ws['A1'] = '台北市私立復興實驗高級中學科任老師課表' + ws['A1'].font = Font(name="DFKai-SB", size=15, bold=True) + ws['A1'].alignment = center + # loop over A:E + for i in range(0, 5): + ws[str(chr(ord('A') + i)) + '1'].border = border + ws.merge_cells('F1:G1') + ws['F1'] = teacher_name + " 老師" + ws['F1'].font = Font(name='Calibri', size=15, bold=True) + ws['F1'].alignment = center + ws['F1'].border = border + ws['G1'].border = border + + ws.row_dimensions[1].height = 40 + ws.row_dimensions[2].height = 25 + ws.column_dimensions['A'].width = 3 + ws.column_dimensions['B'].width = 10 + + ws.merge_cells('A2:B2') + ws['A2'] = '時間' + ws['C2'] = '星期一' + ws['D2'] = '星期二' + ws['E2'] = '星期三' + ws['F2'] = '星期四' + ws['G2'] = '星期五' + + # loop over A2:G2 + for i in range(1, 8): + ws.cell(row=2, column=i).font = Font(size=14, bold=True) + ws.cell(row=2, column=i).alignment = center + ws.cell(row=2, column=i).border = border + + # loop over C:G + for i in range(2, 8): + ws.column_dimensions[str(chr(ord('A') + i))].width = 13 + + # get data + data = {} + db = refresh_db() + cursor = db.cursor() + if orig_username is not '': + cursor.execute('SELECT category,subclass FROM gpclasses WHERE accs LIKE %s', ('%'+orig_username+'%',)) + gp_sql = cursor.fetchall() + for i in gp_sql: + cursor.execute('SELECT dow,period FROM schedule WHERE teacher=%s', (i[0], )) + tmp_sql = cursor.fetchall() + for j in tmp_sql: + if j[0] not in data: + data[j[0]] = {} + data[j[0]][j[1]] = { + 'subject': i[0], + 'class': i[1] + } + cursor.execute("SELECT dow,period,subject,grade,class_ FROM schedule WHERE teacher=%s", (teacher_name, )) + sql = cursor.fetchall() + # loop over data + for i in sql: + if i[0] not in data: + data[i[0]] = {} + data[i[0]][i[1]] = { + 'subject': i[2], + 'class': str(i[3]) + str(i[4]) + } + + periods=['m', '1', '2', '3', '4', 'n', '5', '6', '7', '8', '9'] + times = { + 'm': ['7:30', '8:10'], + '1': ['8:20', '9:05'], + '2': ['9:15', '10:00'], + '3': ['10:10', '10:55'], + '4': ['11:05', '11:50'], + 'n': ['11:50', '13:05'], + '5': ['13:15', '14:00'], + '6': ['14:10', '14:55'], + '7': ['15:05', '15:50'], + '8': ['15:55', '16:40'], + '9': ['16:45', '17:30'] + } + curr = 3 + for p in periods: + ws.merge_cells('A' + str(curr) + ':A' + str(curr + 1)) + ws.row_dimensions[curr].height = 20 + ws.row_dimensions[curr + 1].height = 20 + ws['A' + str(curr)] = p + ws['A' + str(curr)].font = std_font + ws['A' + str(curr)].alignment = center + ws['A' + str(curr)].border = border + ws['A' + str(curr + 1)].border = border + ws['B' + str(curr)] = times[p][0] + ws['B' + str(curr)].font = std_font + ws['B' + str(curr)].alignment = center + ws['B' + str(curr)].border = border + ws['B' + str(curr + 1)] = times[p][1] + ws['B' + str(curr + 1)].font = std_font + ws['B' + str(curr + 1)].alignment = center + ws['B' + str(curr + 1)].border = border + + if p == 'm' or p == 'n': + ws.merge_cells('C' + str(curr) + ':G' + str(curr + 1)) + for i in range(1, 6): + ws[chr(ord('C') + i-1) + str(curr)].font = std_font + ws[chr(ord('C') + i-1) + str(curr)].alignment = center + ws[chr(ord('C') + i-1) + str(curr)].border = border + ws[chr(ord('C') + i-1) + str(curr + 1)].border = border + if p == 'm': + ws['C' + str(curr)] = '早自習' + else: + ws['C' + str(curr)] = '午餐 / 午休' + else: + for i in range(1, 6): + ws.merge_cells(chr(ord('C') + i-1) + str(curr) + ':' + chr(ord('C') + i-1) + str(curr + 1)) + ws[chr(ord('C') + i-1) + str(curr)].font = std_font + ws[chr(ord('C') + i-1) + str(curr)].border = border + ws[chr(ord('C') + i-1) + str(curr + 1)].border = border + ws[chr(ord('C') + i-1) + str(curr)].alignment = center + Alignment(wrapText=True) + if i in data: + if p in data[i]: + ws[chr(ord('C') + i-1) + str(curr)] = (data[i][p]['subject'] + '\n' + data[i][p]['class'] if data[i][p]['subject'] != 'GP' + and data[i][p]['subject'] != '--' else '' if data[i][p]['subject'] == '--' else data[i][p]['teacher']) + curr += 2 + return workbook \ No newline at end of file diff --git a/login.py b/login.py index 1553454..aa55bd2 100644 --- a/login.py +++ b/login.py @@ -283,7 +283,6 @@ def resetPassword(): WHERE resetID = %s """, (request.args.get('resetCode'),)) user = cursor.fetchone() - cursor.close() dtnow = datetime.now(tz).replace(tzinfo=None) if user == None: raise Exception('無此重置密碼代碼
Invalid reset password code') diff --git a/manage/__pycache__/admin.cpython-39.pyc b/manage/__pycache__/admin.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c8ad650842b1e7bef7f04f0dcc4287a2ebf23a2a GIT binary patch literal 5406 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 literal 0 HcmV?d00001 diff --git a/manage/__pycache__/homeroom.cpython-39.pyc b/manage/__pycache__/homeroom.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27979771cda020144d43aa76b6fbc073089ad3c4 GIT binary patch literal 4541 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 literal 0 HcmV?d00001 diff --git a/manage/__pycache__/manage.cpython-39.pyc b/manage/__pycache__/manage.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c562c7a89c95f7f8af13beed3cdbd486fd1a73e GIT binary patch literal 8567 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 BVHp4b literal 0 HcmV?d00001 diff --git a/manage/__pycache__/student.cpython-39.pyc b/manage/__pycache__/student.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a74af622c181e4fbadb7c5273b99f2a7a67580aa GIT binary patch literal 1620 zcmc&!%ZnpL7_aJ1`jMGL)b%kcYk|s6q}ledzCgvybVe7(ET*%lb7^|IYLYnp2vybU z4p|T~H(gKSK@fMr%N+FNK}7Jl|3h7681`S7i+7JCcXL2!ESX2(U|dj-QyXdg80-;$3k8l$t*3`;fKO` zk0)PzbMo^~$De+C^1~;0K0Dm8!@<>{vk|IV9%t;xQgu0&DO0tq zpn#B!SUE|_dA}$!-UQct1)%M!`;rk$_9IB>IFIHTQVwTy%vmB;le0a}#3+)*KFfhh zOo(xjtHx4Jca;TxMZuNLK4wWNnR51+Oh$2ldCHg{FtIO-iQkbDe8qXf{4CDnAzPC9;^dlYiBa*< zB3Y0t-BIEk05UA>U<;qC(81^7%L&L2R+i@eKhgh7Q2lS{KQ(3;BkBH&HsJ7>AZ}~W zVJgzO8 zXE+sv_ku`h?|(%pAk`Ca(reqw-7E7%LW>CHZloov!YU_lj2r=gh$kqlFu*E&MwkeX1h> literal 0 HcmV?d00001 diff --git a/manage/admin.py b/manage/admin.py new file mode 100644 index 0000000..23296b2 --- /dev/null +++ b/manage/admin.py @@ -0,0 +1,139 @@ +from functions import * +from export import * +admin = Blueprint('admin', __name__) + +@admin.route('/manage/admin/mark', methods=['GET', 'POST']) +def mark_absent(): + if (check_login_status() or session['subuser_type'] != 'admin'): + return redirect('/logout') + refresh_token() + if request.method == 'POST': + try: + data = request.form.to_dict() + periods = [i[7] for i in data if i.startswith('period-')] + db = refresh_db() + cursor = db.cursor() + for p in periods: + cursor.execute("INSERT INTO absent (grade, class_, date, period, num, status, note) VALUES (%s, %s, %s, %s, %s, %s, %s)", + (data['grade'], data['class'], data['date'], p, data['num'], data['type'], data['notes'] if 'notes' in data else '')) + db.commit() + except Exception as e: + flash(e) + else: + flash("`成功! (" + data['grade'] + data['class'] + "班" + data['num'] + "號, 日期: " + data['date'] + ", 總計 " + str(len(periods)) + "堂課)") + return redirect('/manage/admin/mark') + db = refresh_db() + cursor = db.cursor() + cursor.execute("SELECT grade, class_, num, name FROM students ORDER BY grade,class_,num ASC") + sql = cursor.fetchall() + students = {} + for i in sql: + if i[0] not in students: + students[i[0]] = {} + if i[1] not in students[i[0]]: + students[i[0]][i[1]] = {} + students[i[0]][i[1]][i[2]] = i[3] + cursor.execute("SELECT date,period,grade,class_,num,status,note FROM absent ORDER BY id DESC LIMIT 10") + records = cursor.fetchall() + return render_template("admin_mark.html", students=students, periods=['m', '1', '2', '3', '4', 'n', '5', '6', '7', '8', '9'], records=records, hideSel=True) + +@admin.route('/manage/admin/export', methods=['GET']) +def admin_export(): + if (check_login_status() or session['subuser_type'] != 'admin'): + return redirect('/logout') + refresh_token() + return render_template("admin_export.html", hideSel=True) + +@admin.route('/manage/admin/export/homeroom_period', methods=['POST']) +def admin_export_homeroom_period(): + if (check_login_status() or session['subuser_type'] != 'admin'): + return redirect('/logout') + refresh_token() + workbook = Workbook() + workbook.remove_sheet(workbook.get_sheet_by_name('Sheet')) + workbook = create_period_sheets(workbook, [request.form['grade'], request.form['class']]) + excel_stream = io.BytesIO() + workbook.save(excel_stream) + excel_stream.seek(0) + return send_file(excel_stream, attachment_filename='homeroom_period_' + request.form['grade'] + request.form['class'] +'.xlsx', as_attachment=True) + +@admin.route('/manage/admin/export/homeroom_period/all', methods=['GET']) +def admin_export_homeroom_period_all(): + if (check_login_status() or session['subuser_type'] != 'admin'): + return redirect('/logout') + refresh_token() + db = refresh_db() + cursor = db.cursor() + cursor.execute("SELECT grade,class_ FROM homerooms") + homerooms = cursor.fetchall() + workbook = Workbook() + workbook.remove_sheet(workbook.get_sheet_by_name('Sheet')) + for i in homerooms: + workbook = create_period_sheets(workbook, [str(i[0]), str(i[1])]) + excel_stream = io.BytesIO() + workbook.save(excel_stream) + excel_stream.seek(0) + return send_file(excel_stream, attachment_filename='homeroom_period_all.xlsx', as_attachment=True) + + +@admin.route('/manage/admin/export/student_list', methods=['POST']) +def admin_export_student_list(): + if (check_login_status() or session['subuser_type'] != 'admin'): + return redirect('/logout') + refresh_token() + workbook = Workbook() + workbook.remove_sheet(workbook.get_sheet_by_name('Sheet')) + workbook = create_student_list(workbook, [request.form['grade'], request.form['class']]) + excel_stream = io.BytesIO() + workbook.save(excel_stream) + excel_stream.seek(0) + return send_file(excel_stream, attachment_filename='student_list_' + request.form['grade'] + request.form['class'] +'.xlsx', as_attachment=True) + +@admin.route("/manage/admin/export/student_list/all", methods=['GET']) +def admin_export_student_list_all(): + if (check_login_status() or session['subuser_type'] != 'admin'): + return redirect('/logout') + refresh_token() + db = refresh_db() + cursor = db.cursor() + cursor.execute("SELECT grade,class_ FROM homerooms") + homerooms = cursor.fetchall() + workbook = Workbook() + workbook.remove_sheet(workbook.get_sheet_by_name('Sheet')) + for i in homerooms: + workbook = create_student_list(workbook, [str(i[0]), str(i[1])]) + excel_stream = io.BytesIO() + workbook.save(excel_stream) + excel_stream.seek(0) + return send_file(excel_stream, attachment_filename='student_list_all.xlsx', as_attachment=True) + +@admin.route('/manage/admin/export/teacher_period', methods=['POST']) +def admin_export_teacher_period(): + if (check_login_status() or session['subuser_type'] != 'admin'): + return redirect('/logout') + refresh_token() + workbook = Workbook() + workbook.remove_sheet(workbook.get_sheet_by_name('Sheet')) + workbook = create_teacher_periods(workbook, request.form['name'], request.form['orig_username']) + excel_stream = io.BytesIO() + workbook.save(excel_stream) + excel_stream.seek(0) + return send_file(excel_stream, attachment_filename='teacher_period_' + request.form['name'] + '_' + ('' if 'orig_username' not in request.form else request.form['orig_username']) +'.xlsx', as_attachment=True) + +@admin.route('/manage/admin/export/teacher_period/all', methods=['GET']) +def admin_export_teacher_period_all(): + if (check_login_status() or session['subuser_type'] != 'admin'): + return redirect('/logout') + refresh_token() + db = refresh_db() + cursor = db.cursor() + cursor.execute("SELECT name,oldUsername FROM users") + teachers = cursor.fetchall() + workbook = Workbook() + workbook.remove_sheet(workbook.get_sheet_by_name('Sheet')) + for i in teachers: + workbook = create_teacher_periods(workbook, i[0], i[1]) + excel_stream = io.BytesIO() + workbook.save(excel_stream) + excel_stream.seek(0) + return send_file(excel_stream, attachment_filename='teacher_period_all.xlsx', as_attachment=True) \ No newline at end of file diff --git a/manage/group.py b/manage/group.py new file mode 100644 index 0000000..9f5a7b2 --- /dev/null +++ b/manage/group.py @@ -0,0 +1,102 @@ +from functions import * +group = Blueprint('group', __name__) + +@group.route('/manage/group_teach_publish', methods=['POST']) +def group_teach_publish(): + if (check_login_status()): + return redirect('/logout') + refresh_token() + data = request.form.to_dict() + cclass = { + "category": data.pop('category'), + "class_id": data.pop('class_id') + } + db = refresh_db() + cursor = db.cursor() + cursor.execute("SELECT about FROM gpclasses WHERE category=%s AND subclass=%s", + (cclass['category'], cclass['class_id'])) + cclass["name"] = cursor.fetchone()[0] + cursor.execute("SELECT grade,class_,num,name,ename FROM students WHERE classes LIKE " + '\'%\"'+ cclass['category'] + '\": \"' + cclass['class_id'] +'\"%\'' + " ORDER BY grade ASC,class_ ASC,num ASC") + students = cursor.fetchall() + homerooms = [] + for x in students: + if (str(x[0]) + '^' + str(x[1])) not in homerooms: + homerooms.append(str(x[0]) + '^' + str(x[1])) + data.pop('dsnumbers') + data.pop('dsoffense') + data.pop('dsoffenseother') + date = data.pop('date') + period = data.pop('period') + signature = data.pop('signatureData') + notes = data.pop('notes') + submissionType = data.pop('submissionType') + if (submissionType == 'newAbsent'): + absentData = [] + for x in data: + xs = x.split('^') + if xs[0] == 'note': + continue + else: + absentData.append([xs[1], xs[2], xs[3], 'K' if xs[0] == '1' else 'L', data['note^'+xs[1]+'^'+xs[2]+'^'+xs[3]]]) + for h in homerooms: + h = h.split('^') + cursor = db.cursor() + cursor.execute(""" + SELECT signature, notes FROM submission WHERE grade=%s AND class_=%s AND date=%s AND period=%s + """, (h[0], h[1], date, period)) + one = cursor.fetchone() + if one is None: + jSignature = json.dumps({cclass['class_id']: signature}) + cursor.execute(""" + INSERT INTO submission (grade, class_, date, period, signature, notes) + VALUES (%s, %s, %s, %s, %s, %s) + """, (h[0], h[1], date, period, jSignature, notes)) + db.commit() + else: + jSignature = json.loads(one[0]) + if cclass['class_id'] in jSignature: + continue + jSignature[cclass['class_id']] = signature + note = one[1] + '; ' + notes + cursor.execute(""" + UPDATE submission SET signature=%s, notes=%s WHERE grade=%s AND class_=%s AND date=%s AND period=%s + """, (json.dumps(jSignature), note, h[0], h[1], date, period)) + db.commit() + for a in absentData: + cursor = db.cursor() + cursor.execute(""" + INSERT INTO absent (grade, class_, num, date, period, status, note) + VALUES (%s, %s, %s, %s, %s, %s, %s) + """, (a[0], a[1], a[2], date, period, a[3], a[4])) + db.commit() + elif (submissionType == 'dsSubmit'): + dsData = [] + for x in data: + xs = x.split('^') + if xs[0] == 'note': + continue + elif xs[0] == 'ds': + dsData.append([xs[1], xs[2].split('-')[0], xs[2].split('-')[1], data[x]]) + for h in homerooms: + h = h.split('^') + cursor = db.cursor() + cursor.execute(""" + SELECT dscfrm, notes FROM submission WHERE grade=%s AND class_=%s AND date=%s AND period=%s + """, (h[0], h[1], date, period)) + one = cursor.fetchone() + dsCfrm = [] if one[0] == None else json.loads(one[0]) + if cclass['class_id'] in dsCfrm: + continue + dsCfrm.append(cclass['class_id']) + note = one[1] + '; ' + notes + cursor.execute(""" + UPDATE submission SET dsCfrm=%s, notes=%s WHERE grade=%s AND class_=%s AND date=%s AND period=%s + """, (json.dumps(dsCfrm), note, h[0], h[1], date, period)) + for d in dsData: + cursor = db.cursor() + cursor.execute(""" + INSERT INTO ds (grade, class_, num, date, period, note) + VALUES (%s, %s, %s, %s, %s, %s) + """, (d[0], d[1], d[2], date, period, d[3])) + db.commit() + return redirect('/manage') \ No newline at end of file diff --git a/manage/homeroom.py b/manage/homeroom.py new file mode 100644 index 0000000..33cc03e --- /dev/null +++ b/manage/homeroom.py @@ -0,0 +1,141 @@ +from functions import * +homeroom = Blueprint('homeroom', __name__) + +@homeroom.route('/manage/abs', methods=['GET']) +def showAllAbs(): + if (check_login_status()): + return redirect('/logout') + refresh_token() + currRoom = session['homeroom'].split('^') + db = refresh_db() + cursor = db.cursor() + cursor.execute("SELECT num,name,ename FROM students WHERE grade=%s AND class_=%s ORDER BY num ASC", (currRoom[0], currRoom[1])) + studentsSQL = cursor.fetchall() + students = {} + for st in studentsSQL: + students[st[0]] = { + 'name': st[1], + 'ename': st[2], + } + cursor = db.cursor() + cursor.execute("SELECT date, period, num, status, note FROM absent WHERE grade=%s AND class_=%s ORDER BY date DESC, FIND_IN_SET(period, 'm,1,2,3,4,n,5,6,7,8,9') DESC, num ASC", (currRoom[0], currRoom[1])) + absentDataSQL = cursor.fetchall() + return render_template("list.html", title="Absent List | 缺勤紀錄", mode='ABS', students=students, data=absentDataSQL, currRoom=currRoom) + +@homeroom.route('/manage/ds', methods=['GET']) +def showAllDS(): + if (check_login_status()): + return redirect('/logout') + refresh_token() + currRoom = session['homeroom'].split('^') + db = refresh_db() + cursor = db.cursor() + cursor.execute("SELECT num,name,ename FROM students WHERE grade=%s AND class_=%s ORDER BY num ASC", (currRoom[0], currRoom[1])) + studentsSQL = cursor.fetchall() + students = {} + for st in studentsSQL: + students[st[0]] = { + 'name': st[1], + 'ename': st[2], + } + cursor = db.cursor() + cursor.execute("SELECT date, period, num, note FROM ds WHERE grade=%s AND class_=%s ORDER BY date DESC, FIND_IN_SET(period, 'm,1,2,3,4,n,5,6,7,8,9') DESC, num ASC", (currRoom[0], currRoom[1])) + dsDataSQL = cursor.fetchall() + return render_template("list.html", title="DS List | 定心紀錄", mode='DS', students=students, data=dsDataSQL, currRoom=currRoom) + +@homeroom.route('/manage/homeroom_abs', methods=['POST']) +def homeroom_abs_publish(): + if (check_login_status()): + return redirect('/logout') + refresh_token() + db = refresh_db() + data = request.form.to_dict() + date = data.pop('date') + period = data.pop('period') + signature = data.pop('signatureData') + notes = data.pop('notes') + homeroom = data.pop('homeroom').split('^') + absentData = {} + for x in data: + xt = x.split('^') + if (xt[0] == 'note'): + if xt[2] not in absentData: + absentData[xt[2]] = {} + absentData[xt[2]]['note'] = data[x] + else: + if xt[1] not in absentData: + absentData[xt[1]] = {} + absentData[xt[1]]['status'] = 'L' if x[0] == '2' else 'K' + cursor = db.cursor() + cursor.execute(""" + INSERT INTO submission + (grade, class_, date, period, signature, notes) + VALUES (%s, %s, %s, %s, %s, %s) + """, (homeroom[0], homeroom[1], date, period, signature, notes)) + for x in absentData: + cursor.execute(""" + INSERT INTO absent + (grade, class_, date, period, num, status, note) + VALUES (%s, %s, %s, %s, %s, %s, %s) + """, (homeroom[0], homeroom[1], date, period, x, absentData[x]['status'], absentData[x]['note'] if 'note' in absentData[x] else '')) + db.commit() + return redirect('/manage') + +@homeroom.route('/manage/homeroom_ds', methods=['POST']) +def homeroom_ds_publish(): + if (check_login_status()): + return redirect('/logout') + refresh_token() + db = refresh_db() + cursor = db.cursor() + data = request.form.to_dict() + print(data) + date = data.pop('date') + period = data.pop('period') + notes = ';' + data.pop('notes') + homeroom = data.pop('homeroom').split('^') + dsidv = {} + ds1 = data.pop('ds^1') + ds2 = data.pop('ds^2') + ds3 = data.pop('ds^3') + ds4 = data.pop('ds^4') + ds5 = data.pop('ds^5') + ds6 = data.pop('ds^6') + ds7 = data.pop('ds^7') + cursor.execute(""" + UPDATE submission + SET ds1=%s,ds2=%s,ds3=%s,ds4=%s,ds5=%s,ds6=%s,ds7=%s,notes=concat(ifnull(notes,""), %s),dscfrm='yes' + WHERE grade=%s AND class_=%s AND date=%s AND period=%s + """, (ds1, ds2, ds3, ds4, ds5, ds6, ds7, notes, homeroom[0], homeroom[1], date, period)) + for x in data: + xt = x.split('^') + if (xt[0] == 'dsidv'): + dsidv[xt[1]] = data[x] + for x in dsidv: + cursor.execute(""" + INSERT INTO ds + (grade, class_, date, period, num, note) + VALUES (%s, %s, %s, %s, %s, %s) + """, (homeroom[0], homeroom[1], date, period, x, dsidv[x])) + db.commit() + return redirect('/manage') + +@homeroom.route('/manage/homeroom_confirm', methods=['POST']) +def homeroom_confirm(): + if (check_login_status()): + return redirect('/logout') + refresh_token() + data = request.form.to_dict() + homeroom = data.pop('homeroom').split('^') + date = data.pop('date') + signature = data.pop('signatureData') + notes = data.pop('notes') + db = refresh_db() + cursor = db.cursor() + cursor.execute(""" + INSERT INTO submission + (grade, class_, date, period, signature, notes) + VALUES (%s, %s, %s, 'c', %s, %s) + """, (homeroom[0], homeroom[1], date, signature, notes)) + db.commit() + return redirect('/manage') diff --git a/manage.py b/manage/manage.py similarity index 60% rename from manage.py rename to manage/manage.py index d3d3d1d..9c5f886 100644 --- a/manage.py +++ b/manage/manage.py @@ -1,6 +1,29 @@ from functions import * - +from manage.homeroom import homeroom +from manage.student import student +from manage.admin import admin +from manage.group import group manage = Blueprint('manage', __name__) +manage.register_blueprint(homeroom) +manage.register_blueprint(student) +manage.register_blueprint(admin) +manage.register_blueprint(group) + +@manage.route('/manage', methods=['GET']) +def manageRoot(): + return manageProcess("", "") + +@homeroom.route('/manage/date/', methods=['GET']) +def manage_date(date): + return manageProcess("date", date) + +@manage.route('/manage/admin///', methods=['GET']) +def manage_admin(g, r, date): + data = [ + g + '^' + r, + date + ] + return manageProcess("admin", data) def manageProcess(fCommand, fData): @@ -182,14 +205,9 @@ def manageProcess(fCommand, fData): if (h not in data[cclass['category'] + ' ' + cclass['class_id']][p[0]]): data[cclass['category'] + ' ' + cclass['class_id']][p[0]][h] = {} cursor = db.cursor() - cursor.execute("SELECT signature FROM submission WHERE grade=%s AND class_=%s AND date=%s AND period=%s", (hs[0], hs[1], currDate, p[0])) + cursor.execute("SELECT signature, dscfrm FROM submission WHERE grade=%s AND class_=%s AND date=%s AND period=%s", (hs[0], hs[1], currDate, p[0])) submissionSQL = cursor.fetchone() submitted = False - try: - if submissionSQL[0] == 'STUD_AFFAIR_OFFICE': - submitted = True - except: - pass try: signatures = json.loads(submissionSQL[0]) if cclass['class_id'] in signatures: @@ -226,6 +244,7 @@ def manageProcess(fCommand, fData): "ename": x[4], "status": status, "note": '' if studStatus == [] else studStatus[0][2], + "needDS": False if hrCfrm != True and submissionSQL[1] != None and cclass['class_id'] in json.loads(submissionSQL[1]) else True } return render_template('group_teach.html', dates=dates, currDate=currDate, data=data, dsoffenses=DSOFFENSES) elif pl == 'homeroom': @@ -291,7 +310,7 @@ def manageProcess(fCommand, fData): "special": True } cursor = db.cursor() - cursor.execute("SELECT period, signature, notes, ds1,ds2,ds3,ds4,ds5,ds6,ds7 FROM submission WHERE grade=%s AND class_=%s AND date=%s", (currRoom[0], currRoom[1], currDate)) + cursor.execute("SELECT period, signature, notes, ds1,ds2,ds3,ds4,ds5,ds6,ds7, dscfrm FROM submission WHERE grade=%s AND class_=%s AND date=%s", (currRoom[0], currRoom[1], currDate)) submissionSQL = cursor.fetchall() cursor = db.cursor() cursor.execute("SELECT period, num, note FROM ds WHERE grade=%s AND class_=%s AND date=%s", (currRoom[0], currRoom[1], currDate)) @@ -328,6 +347,8 @@ def manageProcess(fCommand, fData): "ds6": i[8], "ds7": i[9], } + if i[10] == 'yes': + submission[i[0]]["dscfrm"] = True cursor = db.cursor() cursor.execute("SELECT period, num, status, note FROM absent WHERE grade=%s AND class_=%s AND date=%s", (currRoom[0], currRoom[1], currDate)) absentDataSQL = cursor.fetchall() @@ -342,255 +363,4 @@ def manageProcess(fCommand, fData): return render_template('homeroom.html', currRoom=currRoom, students=students, currDate=currDate, schedule=schedule, submission=submission, currPeriod=currPeriod, studGP=studGP, dates=dates, absentData=absentData, periods=['m', '1', '2', '3', '4', 'n', '5', '6', '7', '8', '9'], dsboard=DSBOARD, dstext=DSTEXT, dsoffenses=DSOFFENSES, idvDS=idvDS) else: - return redirect('/logout') - - -@manage.route('/manage', methods=['GET']) -def manageRoot(): - return manageProcess("", "") - - -@manage.route('/manage/date/', methods=['GET']) -def manage_date(date): - return manageProcess("date", date) - - -@manage.route('/manage/admin///', methods=['GET']) -def manage_admin(g, r, date): - data = [ - g + '^' + r, - date - ] - return manageProcess("admin", data) - -@manage.route('/student', methods=['GET']) -def showStudentAbs(): - if (check_login_status()): - return redirect('/logout') - refresh_token() - if not ('user_type' in session and session['user_type'] == 'student'): - return redirect('/') - db = refresh_db() - cursor = db.cursor() - cursor.execute("SELECT date, period, num, status, note FROM absent WHERE grade=%s AND class_=%s AND num=%s ORDER BY date DESC, period DESC, num ASC", (session['grade'], session['class'], session['num'])) - absentDataSQL = cursor.fetchall() - return render_template("list.html", title="Student Absent List | 學生缺勤紀錄", mode='STUDABS', data=absentDataSQL, currRoom=[session['grade'],session['class']], name=session['name'], num=session['num']) - -@manage.route('/student/ds', methods=['GET']) -def showStudentDS(): - if (check_login_status()): - return redirect('/logout') - refresh_token() - if not ('user_type' in session and session['user_type'] == 'student'): - return redirect('/') - db = refresh_db() - cursor = db.cursor() - cursor.execute("SELECT date, period, num, note FROM ds WHERE grade=%s AND class_=%s AND num=%s ORDER BY date DESC, period DESC, num ASC", (session['grade'], session['class'], session['num'])) - dsDataSQL = cursor.fetchall() - print(dsDataSQL) - return render_template("list.html", title="Student DS List | 學生定心紀錄", mode='STUDDS', data=dsDataSQL, currRoom=[session['grade'],session['class']], name=session['name'], num=session['num']) - -@manage.route('/manage/abs', methods=['GET']) -def showAllAbs(): - if (check_login_status()): - return redirect('/logout') - refresh_token() - currRoom = session['homeroom'].split('^') - db = refresh_db() - cursor = db.cursor() - cursor.execute("SELECT num,name,ename FROM students WHERE grade=%s AND class_=%s ORDER BY num ASC", (currRoom[0], currRoom[1])) - studentsSQL = cursor.fetchall() - students = {} - for st in studentsSQL: - students[st[0]] = { - 'name': st[1], - 'ename': st[2], - } - cursor = db.cursor() - cursor.execute("SELECT date, period, num, status, note FROM absent WHERE grade=%s AND class_=%s ORDER BY date DESC, period DESC, num ASC", (currRoom[0], currRoom[1])) - absentDataSQL = cursor.fetchall() - return render_template("list.html", title="Absent List | 缺勤紀錄", mode='ABS', students=students, data=absentDataSQL, currRoom=currRoom) - -@manage.route('/manage/ds', methods=['GET']) -def showAllDS(): - if (check_login_status()): - return redirect('/logout') - refresh_token() - currRoom = session['homeroom'].split('^') - db = refresh_db() - cursor = db.cursor() - cursor.execute("SELECT num,name,ename FROM students WHERE grade=%s AND class_=%s ORDER BY num ASC", (currRoom[0], currRoom[1])) - studentsSQL = cursor.fetchall() - students = {} - for st in studentsSQL: - students[st[0]] = { - 'name': st[1], - 'ename': st[2], - } - cursor = db.cursor() - cursor.execute("SELECT date, period, num, note FROM ds WHERE grade=%s AND class_=%s ORDER BY date DESC, period DESC, num ASC", (currRoom[0], currRoom[1])) - dsDataSQL = cursor.fetchall() - return render_template("list.html", title="DS List | 定心紀錄", mode='DS', students=students, data=dsDataSQL, currRoom=currRoom) - -@manage.route('/manage/group_teach_publish', methods=['POST']) -def group_teach_publish(): - if (check_login_status()): - return redirect('/logout') - refresh_token() - data = request.form.to_dict() - cclass = { - "category": data.pop('category'), - "class_id": data.pop('class_id') - } - db = refresh_db() - cursor = db.cursor() - cursor.execute("SELECT about FROM gpclasses WHERE category=%s AND subclass=%s", - (cclass['category'], cclass['class_id'])) - cclass["name"] = cursor.fetchone()[0] - cursor.execute("SELECT grade,class_,num,name,ename FROM students WHERE classes LIKE " + '\'%\"'+ cclass['category'] + '\": \"' + cclass['class_id'] +'\"%\'' + " ORDER BY grade ASC,class_ ASC,num ASC") - students = cursor.fetchall() - homerooms = [] - for x in students: - if (str(x[0]) + '^' + str(x[1])) not in homerooms: - homerooms.append(str(x[0]) + '^' + str(x[1])) - data.pop('dsnumbers') - data.pop('dsoffense') - data.pop('dsoffenseother') - date = data.pop('date') - period = data.pop('period') - signature = data.pop('signatureData') - notes = data.pop('notes') - absentData = [] - dsData = [] - for x in data: - xs = x.split('^') - if xs[0] == 'note': - continue - elif xs[0] == 'ds': - dsData.append([xs[1], xs[2].split('-')[0], xs[2].split('-')[1], data[x]]) - else: - absentData.append([xs[1], xs[2], xs[3], 'K' if xs[0] == '1' else 'L', data['note^'+xs[1]+'^'+xs[2]+'^'+xs[3]]]) - for h in homerooms: - h = h.split('^') - cursor = db.cursor() - cursor.execute(""" - SELECT signature, notes FROM submission WHERE grade=%s AND class_=%s AND date=%s AND period=%s - """, (h[0], h[1], date, period)) - one = cursor.fetchone() - if one is None: - jSignature = json.dumps({cclass['class_id']: signature}) - cursor.execute(""" - INSERT INTO submission (grade, class_, date, period, signature, notes) - VALUES (%s, %s, %s, %s, %s, %s) - """, (h[0], h[1], date, period, jSignature, notes)) - db.commit() - else: - jSignature = json.loads(one[0]) - if cclass['class_id'] in jSignature: - continue - jSignature[cclass['class_id']] = signature - note = one[1] + '; ' + notes - cursor.execute(""" - UPDATE submission SET signature=%s, notes=%s WHERE grade=%s AND class_=%s AND date=%s AND period=%s - """, (json.dumps(jSignature), note, h[0], h[1], date, period)) - db.commit() - for d in dsData: - cursor = db.cursor() - cursor.execute(""" - INSERT INTO ds (grade, class_, num, date, period, note) - VALUES (%s, %s, %s, %s, %s, %s) - """, (d[0], d[1], d[2], date, period, d[3])) - db.commit() - for a in absentData: - cursor = db.cursor() - cursor.execute(""" - INSERT INTO absent (grade, class_, num, date, period, status, note) - VALUES (%s, %s, %s, %s, %s, %s, %s) - """, (a[0], a[1], a[2], date, period, a[3], a[4])) - db.commit() - return redirect('/manage') - -@manage.route('/manage/homeroom_abs', methods=['POST']) -def homeroom_abs_publish(): - if (check_login_status()): - return redirect('/logout') - refresh_token() - db = refresh_db() - data = request.form.to_dict() - date = data.pop('date') - period = data.pop('period') - signature = data.pop('signatureData') - notes = data.pop('notes') - homeroom = data.pop('homeroom').split('^') - ds1 = data.pop('ds^1') - ds2 = data.pop('ds^2') - ds3 = data.pop('ds^3') - ds4 = data.pop('ds^4') - ds5 = data.pop('ds^5') - ds6 = data.pop('ds^6') - ds7 = data.pop('ds^7') - # 2: L / 1: K - absentData = {} - dsidv = {} - for x in data: - xt = x.split('^') - if (xt[0] == 'note'): - if xt[2] not in absentData: - absentData[xt[2]] = {} - absentData[xt[2]]['note'] = data[x] - elif (xt[0] == 'dsidv'): - dsidv[xt[1]] = data[x] - else: - if xt[1] not in absentData: - absentData[xt[1]] = {} - absentData[xt[1]]['status'] = 'L' if x[0] == '2' else 'K' - cursor = db.cursor() - cursor.execute(""" - INSERT INTO submission - (grade, class_, date, period, signature, ds1, ds2, ds3, ds4, ds5, ds6, ds7, notes) - VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) - """, (homeroom[0], homeroom[1], date, period, signature, ds1, ds2, ds3, ds4, ds5, ds6, ds7, notes)) - for x in absentData: - cursor.execute(""" - INSERT INTO absent - (grade, class_, date, period, num, status, note) - VALUES (%s, %s, %s, %s, %s, %s, %s) - """, (homeroom[0], homeroom[1], date, period, x, absentData[x]['status'], absentData[x]['note'])) - for x in dsidv: - cursor.execute(""" - INSERT INTO ds - (grade, class_, date, period, num, note) - VALUES (%s, %s, %s, %s, %s, %s) - """, (homeroom[0], homeroom[1], date, period, x, dsidv[x])) - db.commit() - return redirect('/manage') - - -@manage.route('/manage/edit_abs', methods=['POST']) -def edit_abs(): - if (check_login_status() or not check_permission()): - return redirect('/logout') - refresh_token() - data = request.form.to_dict() - print(data) - return "" - -@manage.route('/manage/homeroom_confirm', methods=['POST']) -def homeroom_confirm(): - if (check_login_status()): - return redirect('/logout') - refresh_token() - data = request.form.to_dict() - homeroom = data.pop('homeroom').split('^') - date = data.pop('date') - signature = data.pop('signatureData') - notes = data.pop('notes') - db = refresh_db() - cursor = db.cursor() - cursor.execute(""" - INSERT INTO submission - (grade, class_, date, period, signature, notes) - VALUES (%s, %s, %s, 'c', %s, %s) - """, (homeroom[0], homeroom[1], date, signature, notes)) - db.commit() - return redirect('/manage') + return redirect('/logout') \ No newline at end of file diff --git a/manage/student.py b/manage/student.py new file mode 100644 index 0000000..cf4f977 --- /dev/null +++ b/manage/student.py @@ -0,0 +1,30 @@ +from functions import * +student = Blueprint('student', __name__) + +@student.route('/student', methods=['GET']) +def showStudentAbs(): + if (check_login_status()): + return redirect('/logout') + refresh_token() + if not ('user_type' in session and session['user_type'] == 'student'): + return redirect('/') + db = refresh_db() + cursor = db.cursor() + cursor.execute("SELECT date, period, num, status, note FROM absent WHERE grade=%s AND class_=%s AND num=%s ORDER BY date DESC, FIND_IN_SET(period, 'm,1,2,3,4,n,5,6,7,8,9') DESC, num ASC", (session['grade'], session['class'], session['num'])) + absentDataSQL = cursor.fetchall() + return render_template("list.html", title="Student Absent List | 學生缺勤紀錄", mode='STUDABS', data=absentDataSQL, currRoom=[session['grade'],session['class']], name=session['name'], num=session['num']) + +@student.route('/student/ds', methods=['GET']) +def showStudentDS(): + if (check_login_status()): + return redirect('/logout') + refresh_token() + if not ('user_type' in session and session['user_type'] == 'student'): + return redirect('/') + db = refresh_db() + cursor = db.cursor() + cursor.execute("SELECT date, period, num, note FROM ds WHERE grade=%s AND class_=%s AND num=%s ORDER BY date DESC, FIND_IN_SET(period, 'm,1,2,3,4,n,5,6,7,8,9') DESC, num ASC", (session['grade'], session['class'], session['num'])) + dsDataSQL = cursor.fetchall() + print(dsDataSQL) + return render_template("list.html", title="Student DS List | 學生定心紀錄", mode='STUDDS', data=dsDataSQL, currRoom=[session['grade'],session['class']], name=session['name'], num=session['num']) + diff --git a/static/old_favicon.ico b/static/old_favicon.ico deleted file mode 100644 index 0e9fedd04db5a298b5dfef01692a6805ecf78a4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225530 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請先選擇年級'); + $('span#name').html = "" + if (grade === "") { + $('#class').attr('disabled', 'disabled') + return + } + // get keys in dict + var keys = Object.keys(students[grade]); + keys.forEach(element => { + $('#class').append(``) + }); + $('#class').removeAttr('disabled') +} +function refresh_numbers() { + var grade = $('#grade').val(); + var class_ = $('#class').val(); + $('span#name').html = "" + $('#number').html(''); + if (grade === "") { + $('#class').attr('disabled', 'disabled') + if (clas_ !== "") return + } if (class_ === "") { + $('#number').attr('disabled', 'disabled') + return + } + // get keys in dict + var keys = Object.keys(students[grade][class_]); + keys.forEach(element => { + $('#number').append(``) + }); + $('#number').removeAttr('disabled') +} +function showName() { + var grade = $('#grade').val(); + var class_ = $('#class').val(); + var number = $('#number').val(); + $('#name').html(students[grade][class_][number]); +} +function clearForm() { + document.getElementById('newabs').reset(); + $('#class').attr('disabled', 'disabled') + $('#number').attr('disabled', 'disabled') + $('span#name').html = "" +} diff --git a/static/pagejs/group_teach.js b/static/pagejs/group_teach.js index b2a6251..b14245c 100644 --- a/static/pagejs/group_teach.js +++ b/static/pagejs/group_teach.js @@ -2,13 +2,6 @@ var signaturePad, selPeriod, canvas, width = $(window).width(), modal; var indDS = {}; function submitForm() { if (!signaturePad.isEmpty()) { - for (var i in indDS) { - var tmp = document.createElement('input'); - tmp.type = 'hidden'; - tmp.name = 'ds^' + i; - tmp.value = indDS[i]; - document.getElementById('attendanceData^' + selPeriod).appendChild(tmp); - } $('#' + modal).modal('hide'); loadingAnimation(); signaturePad.off(); @@ -20,6 +13,18 @@ function submitForm() { alert("Please sign first"); } } +function submitDSForm() { + for (var i in indDS) { + var tmp = document.createElement('input'); + tmp.type = 'hidden'; + tmp.name = 'ds^' + i; + tmp.value = indDS[i]; + document.getElementById('attendanceData^' + selPeriod).appendChild(tmp); + } + $('#' + modal).modal('hide'); + loadingAnimation(); + document.getElementById("attendanceData^" + selPeriod).submit(); +} function resizeCanvas() { var ratio = Math.max(window.devicePixelRatio || 1, 1); canvas.width = canvas.offsetWidth * ratio; @@ -29,8 +34,7 @@ function resizeCanvas() { } function viewSignature(period) { selPeriod = period - $('.viewSignatureBtn').attr({ 'disabled': 'disabled' }); - $('.viewSignatureBtn').removeClass('margin-bottom'); + document.getElementById("attendanceData^" + selPeriod).getElementsByClassName("submissionType")[0].value = "newAbsent"; modal = 'sign-' + period; $('#' + modal).modal('show'); var cnt = 0; @@ -58,6 +62,12 @@ function viewSignature(period) { }); resizeCanvas(); } +function signDS(period) { + selPeriod = period + document.getElementById("attendanceData^" + selPeriod).getElementsByClassName("submissionType")[0].value = "dsSubmit"; + modal = 'ds-' + period; + $('#' + modal).modal('show'); +} function unCheckLate(string) { document.getElementById('late^' + string).checked = false; strForNote = string.substring(string.indexOf("^") + 1); diff --git a/static/pagejs/homeroom.js b/static/pagejs/homeroom.js index 1ae3544..33047e9 100644 --- a/static/pagejs/homeroom.js +++ b/static/pagejs/homeroom.js @@ -26,11 +26,6 @@ function submitForm() { document.getElementById('homeroom_confirm').submit() } else { var notes = $('#subjectNotes').val(); - for (var i = 0; i < 7; i++) - document.getElementById('HR-ds'+(i+1)).value = $('.dsboard input[name="ds'+(i+1)+'"]:checked').val(); - for (var i in indDS) { - $('#postHomeroomAbs').append('') - } document.getElementById('HR-signatureData').value = data; document.getElementById('HR-notes').value = notes; document.getElementById('postHomeroomAbs').submit(); @@ -40,6 +35,16 @@ function submitForm() { alert("Please sign first"); } } +function submitDSForm() { + for (var i = 0; i < 7; i++) + document.getElementById('DS-ds'+(i+1)).value = $('.dsboard input[name="ds'+(i+1)+'"]:checked').val(); + for (var i in indDS) { + $('#postHomeroomDS').append('') + } + $('#DS-notes').val($('input#dsNotesEnter').val()); + loadingAnimation() + document.getElementById('postHomeroomDS').submit(); +} function resizeCanvas() { var ratio = Math.max(window.devicePixelRatio || 1, 1); canvas.width = canvas.offsetWidth * ratio; @@ -88,7 +93,6 @@ function afterSelAbs(period) { } function homeroomCfrm() { hrCfrm = true; - $('.ds').attr('hidden', 'hidden'); $('#showSignPeriod').text("HOMEROOM CONFIRM"); $('#showSignSubjectName').text("班導確認"); $('.tobeform').attr('disabled', 'disabled'); @@ -125,4 +129,8 @@ function addDS() { $('#dsoffenseother').val(""); $('#dsoffensesel').val(""); $('#dsnumbersel').val(""); +} +function showSelDS(period) { + $('#DS-period').val(period) + $('#dsCheck').modal('show'); } \ No newline at end of file diff --git a/temp/placeholderfile.txt b/temp/placeholderfile.txt deleted file mode 100644 index 8f11eb7..0000000 --- a/temp/placeholderfile.txt +++ /dev/null @@ -1 +0,0 @@ -this is just so that /temp doesn't disappear \ No newline at end of file diff --git a/templates/admin.html b/templates/admin.html index d754215..18b3d4e 100644 --- a/templates/admin.html +++ b/templates/admin.html @@ -69,67 +69,63 @@ {% for j in periods %}
{% if schedule[j]['subject'] == 'GP' %} - {% for k in submission[j] %} - {% if studGP[i[0]][schedule[j]['teacher']] == k %} - {% if i[0] in absentData[j] %} - {% if absentData[j][i[0]]['status'] == 'L' %} -

𝜑

- {% elif absentData[j][i[0]]['status'] == 'K' %} -

- {% elif absentData[j][i[0]]['status'] == 'G' %} -

- {% elif absentData[j][i[0]]['status'] == 'S' %} -

- {% elif absentData[j][i[0]]['status'] == 'F' %} -

- {% elif absentData[j][i[0]]['status'] == 'P' %} -

- {% elif absentData[j][i[0]]['status'] == 'O' %} -

+ {% for k in submission[j] %} + {% if k!='notes' and i[0] in absentData[j] %} + {% if absentData[j][i[0]]['status'] == 'L' %} +

𝜑

+ {% elif absentData[j][i[0]]['status'] == 'K' %} +

+ {% elif absentData[j][i[0]]['status'] == 'G' %} +

+ {% elif absentData[j][i[0]]['status'] == 'S' %} +

+ {% elif absentData[j][i[0]]['status'] == 'F' %} +

+ {% elif absentData[j][i[0]]['status'] == 'P' %} +

+ {% elif absentData[j][i[0]]['status'] == 'O' %} +

+ {% else %} +

{{absentData[j][i[0]]['status']}}

+ {% endif %} +

{{absentData[j][i[0]]['note']}}

+ {% elif studGP[i[0]][schedule[j]['teacher']] == k %} +

V

+ {% if j in idvDS and i[0] in idvDS[j] %} +

{{idvDS[j][i[0]]}}

+ {% endif %} + {% else %} +

+ {% endif %} + {% endfor %} {% else %} -

{{absentData[j][i[0]]['status']}}

- {% endif %} -

{{absentData[j][i[0]]['note']}}

- {% else %} -

V

- {% if j in idvDS and i[0] in idvDS[j] %} -

{{idvDS[j][i[0]]}}

- {% endif %} - {% endif %} - {% else %} -

- {% endif %} - {% endfor %} - {% else %} - {% if j in submission %} - {% if i[0] in absentData[j] %} - {% if absentData[j][i[0]]['status'] == 'L' %} -

𝜑

- {% elif absentData[j][i[0]]['status'] == 'K' %} -

- {% elif absentData[j][i[0]]['status'] == 'G' %} -

- {% elif absentData[j][i[0]]['status'] == 'S' %} -

- {% elif absentData[j][i[0]]['status'] == 'F' %} -

- {% elif absentData[j][i[0]]['status'] == 'P' %} -

- {% elif absentData[j][i[0]]['status'] == 'O' %} -

- {% else %} -

{{absentData[j][i[0]]['status']}}

- {% endif %} -

{{absentData[j][i[0]]['note']}}

- {% else %} -

V

- {% if j in idvDS and i[0] in idvDS[j] %} -

{{idvDS[j][i[0]]}}

- {% endif %} - {% endif %} - {% else %} -

- {% endif %} + {% if i[0] in absentData[j] %} + {% if absentData[j][i[0]]['status'] == 'L' %} +

𝜑

+ {% elif absentData[j][i[0]]['status'] == 'K' %} +

+ {% elif absentData[j][i[0]]['status'] == 'G' %} +

+ {% elif absentData[j][i[0]]['status'] == 'S' %} +

+ {% elif absentData[j][i[0]]['status'] == 'F' %} +

+ {% elif absentData[j][i[0]]['status'] == 'P' %} +

+ {% elif absentData[j][i[0]]['status'] == 'O' %} +

+ {% else %} +

{{absentData[j][i[0]]['status']}}

+ {% endif %} +

{{absentData[j][i[0]]['note']}}

+ {% elif j in submission %} +

V

+ {% else %} +

+ {% endif %} + {% if j in idvDS and i[0] in idvDS[j] %} +

{{idvDS[j][i[0]]}}

+ {% endif %} {% endif %}
{% endfor %} @@ -201,34 +197,12 @@ {% endif %} {% endfor %} - {% if showUpload == '1' %} -
- {% endif %} + {% include 'footer.html' %} - {% include 'footer.html' %} - \ No newline at end of file diff --git a/templates/admin_export.html b/templates/admin_export.html new file mode 100644 index 0000000..1951af6 --- /dev/null +++ b/templates/admin_export.html @@ -0,0 +1,92 @@ + + + + + + + + Admin 管理員 - Attendance 點名 + + + + + + + + + + + +
+ {% include 'sidebar.html' %} + +
+

Export | 匯出資料

+
+
+

班級課表

+
+
+ + +
+
+ + +
+ + +
+
+
+

學生名單

+
+
+ + +
+
+ + +
+ + +
+
+
+

老師課表

+
+
+ + +
+
+ + +
+ + +
+
+
+ {% include 'footer.html' %} +
+ + + + + + + \ No newline at end of file diff --git a/templates/admin_mark.html b/templates/admin_mark.html new file mode 100644 index 0000000..0b24c1d --- /dev/null +++ b/templates/admin_mark.html @@ -0,0 +1,178 @@ + + + + + + + + Admin 管理員 - Attendance 點名 + + + + + + + + + + + +
+ {% include 'sidebar.html' %} + +
+

Mark Absent | 新增請假

+
+
+
+
+ + +
+
+
+
+ + {% for p in periods %} +
+ + +
+ {% endfor %} +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+
+ {% with messages = get_flashed_messages() %} + {% if messages %} + {% for message in messages %} + {% if message[0] == '`' %} + + {% else %} + + {% endif %} + {% endfor %} + {% endif %} + {% endwith %} +
+

最新 10 筆資料 (完整資料請到 這裡)

+
+
日期
+
節次
+
班級
+
座號
+
姓名
+
假別
+
備註
+
+ {% for r in records %} +
+
{{r[0]}}
+
{{r[1]}}
+
{{r[2]}}{{r[3]}}
+
{{r[4]}}
+
{{students[r[2]][r[3]][r[4]]}}
+
+ {% if r[5] == 'L' %}遲到{% endif %} + {% if r[5] == 'K' %}曠課{% endif %} + {% if r[5] == 'G' %}事假{% endif %} + {% if r[5] == 'S' %}病假{% endif %} + {% if r[5] == 'F' %}喪假{% endif %} + {% if r[5] == 'P' %}疫情假{% endif %} + {% if r[5] == 'O' %}公假{% endif %} +
+
{{r[6]}}
+
+ {% endfor %} + {% include 'footer.html' %} +
+ + + + + + + + \ No newline at end of file diff --git a/templates/group_teach.html b/templates/group_teach.html index ca45166..7a02e46 100644 --- a/templates/group_teach.html +++ b/templates/group_teach.html @@ -47,6 +47,7 @@ +
Grade 年級
@@ -56,6 +57,7 @@
Period {{p}} | 第 {{p}} 節
{% set need_fill = namespace(found=false) %} + {% set need_ds = namespace(found=false) %} {% if data[c] != None %} {% for grade in data[c][p] %} {% for student in data[c][p][grade] %} @@ -113,18 +115,25 @@ onchange="unCheckLate('{{p}}^{{grade}}^{{student}}')">
{% endif %} + {% if data[c][p][grade][student]['needDS'] == True %} + {% set need_ds.found = true %} + {% endif %} {% endfor %} {% endfor %} {% endif %} - {% if not need_fill.found %} - - {% else %} + {% if need_fill.found %} + {% elif need_ds.found %} + + {% else %} + {% endif %} + + + + + + + + +