Spaces:
Sleeping
Sleeping
add user_email
Browse files- app.py +20 -4
- assignment_ui.py +6 -0
- dashboard_service.py +33 -7
- submission_service.py +2 -1
app.py
CHANGED
@@ -758,6 +758,7 @@ def get_paragraph_practice_log_session_content(file_name):
|
|
758 |
# 全文批改歷史紀錄
|
759 |
def generate_paragraph_evaluate_history(
|
760 |
user_data,
|
|
|
761 |
user_nickname,
|
762 |
session_timestamp,
|
763 |
request_origin,
|
@@ -774,6 +775,7 @@ def generate_paragraph_evaluate_history(
|
|
774 |
|
775 |
print("====生成全文批改歷史紀錄====")
|
776 |
print(f"user_data: {user_data}")
|
|
|
777 |
print(f"session_timestamp: {session_timestamp}")
|
778 |
print(f"request_origin: {request_origin}")
|
779 |
|
@@ -800,7 +802,7 @@ def generate_paragraph_evaluate_history(
|
|
800 |
GCS_SERVICE.upload_json_string("jutor_logs", file_name, json.dumps(content))
|
801 |
|
802 |
if assignment_id_input:
|
803 |
-
submission_id = submit_assignment(assignment_id_input, user_data, user_nickname, content, file_name)
|
804 |
if submission_id:
|
805 |
print(f"Assignment submitted successfully. Submission ID: {submission_id}")
|
806 |
else:
|
@@ -952,6 +954,7 @@ def update_exam_contents(selected_title):
|
|
952 |
# === Chinese ===
|
953 |
def generate_chinese_paragraph_practice_history(
|
954 |
user_data,
|
|
|
955 |
user_nickname,
|
956 |
session_timestamp,
|
957 |
request_origin,
|
@@ -984,7 +987,7 @@ def generate_chinese_paragraph_practice_history(
|
|
984 |
GCS_SERVICE.upload_json_string("jutor_logs", file_name, json.dumps(content))
|
985 |
|
986 |
if assignment_id_input:
|
987 |
-
submission_id = submit_assignment(assignment_id_input, user_data, user_nickname, content, file_name)
|
988 |
if submission_id:
|
989 |
print(f"Assignment submitted successfully. Submission ID: {submission_id}")
|
990 |
else:
|
@@ -1000,11 +1003,12 @@ def generate_chinese_paragraph_practice_history(
|
|
1000 |
chinese_full_paragraph_refine_output_table, \
|
1001 |
chinese_full_paragraph_save_output
|
1002 |
|
1003 |
-
def submit_assignment(assignment_id, user_data, user_nickname, submission_content, file_name):
|
1004 |
try:
|
1005 |
submission_id = _SubmissionService.submit_assignment(
|
1006 |
assignment_id=assignment_id,
|
1007 |
student_id=user_data,
|
|
|
1008 |
student_name=user_nickname,
|
1009 |
submission_content=submission_content,
|
1010 |
file_name=file_name,
|
@@ -1575,7 +1579,10 @@ def init_params(request: gr.Request):
|
|
1575 |
assignment_group = gr.update(visible=False)
|
1576 |
|
1577 |
user_data = gr.update(value="")
|
|
|
|
|
1578 |
|
|
|
1579 |
# check if origin is from junyiacademy
|
1580 |
query_params = dict(request.query_params)
|
1581 |
request_origin = request.headers.get("origin", "").replace("https://", "").replace("http://", "")
|
@@ -1595,10 +1602,14 @@ def init_params(request: gr.Request):
|
|
1595 |
if is_env_local:
|
1596 |
admin_group = gr.update(visible=True)
|
1597 |
user_data = gr.update(value="aa")
|
|
|
|
|
1598 |
|
1599 |
if "hf.space" in request_origin:
|
1600 |
admin_group = gr.update(visible=True)
|
1601 |
user_data = gr.update(value="aa")
|
|
|
|
|
1602 |
|
1603 |
# session timestamp 用 2024-01-01-12-00-00 格式, 要用 UTC+8 時間
|
1604 |
session_timestamp = datetime.now(pytz.utc).astimezone(pytz.timezone('Asia/Taipei')).strftime("%Y-%m-%d-%H-%M-%S")
|
@@ -1659,7 +1670,7 @@ def init_params(request: gr.Request):
|
|
1659 |
assignment_id_input = gr.update(value=None)
|
1660 |
assignment_json = gr.update(value=None)
|
1661 |
|
1662 |
-
return user_data, \
|
1663 |
admin_group, session_timestamp, request_origin, \
|
1664 |
assignment_id_input, assignment_json, \
|
1665 |
chinese_assignment_row, \
|
@@ -1749,6 +1760,7 @@ with gr.Blocks(theme=THEME, css=CSS) as demo:
|
|
1749 |
|
1750 |
with gr.Row(visible=False) as admin_group:
|
1751 |
user_data = gr.Textbox(label="User Data", value="", elem_id="jutor_user_data_input")
|
|
|
1752 |
user_nickname = gr.Textbox(label="User Nickname", value="", elem_id="jutor_user_nickname_input")
|
1753 |
session_timestamp = gr.Textbox(label="Session Timestamp", value="", elem_id="jutor_session_timestamp_input")
|
1754 |
request_origin = gr.Textbox(label="Request Domain", value="")
|
@@ -2817,6 +2829,7 @@ with gr.Blocks(theme=THEME, css=CSS) as demo:
|
|
2817 |
fn=generate_paragraph_evaluate_history,
|
2818 |
inputs=[
|
2819 |
user_data,
|
|
|
2820 |
user_nickname,
|
2821 |
session_timestamp,
|
2822 |
request_origin,
|
@@ -3439,6 +3452,7 @@ with gr.Blocks(theme=THEME, css=CSS) as demo:
|
|
3439 |
fn=generate_chinese_paragraph_practice_history,
|
3440 |
inputs=[
|
3441 |
user_data,
|
|
|
3442 |
user_nickname,
|
3443 |
session_timestamp,
|
3444 |
request_origin,
|
@@ -3632,6 +3646,8 @@ with gr.Blocks(theme=THEME, css=CSS) as demo:
|
|
3632 |
inputs =[],
|
3633 |
outputs = [
|
3634 |
user_data,
|
|
|
|
|
3635 |
admin_group,
|
3636 |
session_timestamp,
|
3637 |
request_origin,
|
|
|
758 |
# 全文批改歷史紀錄
|
759 |
def generate_paragraph_evaluate_history(
|
760 |
user_data,
|
761 |
+
user_email,
|
762 |
user_nickname,
|
763 |
session_timestamp,
|
764 |
request_origin,
|
|
|
775 |
|
776 |
print("====生成全文批改歷史紀錄====")
|
777 |
print(f"user_data: {user_data}")
|
778 |
+
print(f"user_email: {user_email}")
|
779 |
print(f"session_timestamp: {session_timestamp}")
|
780 |
print(f"request_origin: {request_origin}")
|
781 |
|
|
|
802 |
GCS_SERVICE.upload_json_string("jutor_logs", file_name, json.dumps(content))
|
803 |
|
804 |
if assignment_id_input:
|
805 |
+
submission_id = submit_assignment(assignment_id_input, user_data, user_email, user_nickname, content, file_name)
|
806 |
if submission_id:
|
807 |
print(f"Assignment submitted successfully. Submission ID: {submission_id}")
|
808 |
else:
|
|
|
954 |
# === Chinese ===
|
955 |
def generate_chinese_paragraph_practice_history(
|
956 |
user_data,
|
957 |
+
user_email,
|
958 |
user_nickname,
|
959 |
session_timestamp,
|
960 |
request_origin,
|
|
|
987 |
GCS_SERVICE.upload_json_string("jutor_logs", file_name, json.dumps(content))
|
988 |
|
989 |
if assignment_id_input:
|
990 |
+
submission_id = submit_assignment(assignment_id_input, user_data, user_email, user_nickname, content, file_name)
|
991 |
if submission_id:
|
992 |
print(f"Assignment submitted successfully. Submission ID: {submission_id}")
|
993 |
else:
|
|
|
1003 |
chinese_full_paragraph_refine_output_table, \
|
1004 |
chinese_full_paragraph_save_output
|
1005 |
|
1006 |
+
def submit_assignment(assignment_id, user_data, user_email, user_nickname, submission_content, file_name):
|
1007 |
try:
|
1008 |
submission_id = _SubmissionService.submit_assignment(
|
1009 |
assignment_id=assignment_id,
|
1010 |
student_id=user_data,
|
1011 |
+
student_email=user_email,
|
1012 |
student_name=user_nickname,
|
1013 |
submission_content=submission_content,
|
1014 |
file_name=file_name,
|
|
|
1579 |
assignment_group = gr.update(visible=False)
|
1580 |
|
1581 |
user_data = gr.update(value="")
|
1582 |
+
user_email = gr.update(value="")
|
1583 |
+
user_nickname = gr.update(value="")
|
1584 |
|
1585 |
+
# check if origin is from junyiacademy
|
1586 |
# check if origin is from junyiacademy
|
1587 |
query_params = dict(request.query_params)
|
1588 |
request_origin = request.headers.get("origin", "").replace("https://", "").replace("http://", "")
|
|
|
1602 |
if is_env_local:
|
1603 |
admin_group = gr.update(visible=True)
|
1604 |
user_data = gr.update(value="aa")
|
1605 |
+
user_email = gr.update(value="[email protected]")
|
1606 |
+
user_nickname = gr.update(value="aa_name")
|
1607 |
|
1608 |
if "hf.space" in request_origin:
|
1609 |
admin_group = gr.update(visible=True)
|
1610 |
user_data = gr.update(value="aa")
|
1611 |
+
user_email = gr.update(value="[email protected]")
|
1612 |
+
user_nickname = gr.update(value="aa_name")
|
1613 |
|
1614 |
# session timestamp 用 2024-01-01-12-00-00 格式, 要用 UTC+8 時間
|
1615 |
session_timestamp = datetime.now(pytz.utc).astimezone(pytz.timezone('Asia/Taipei')).strftime("%Y-%m-%d-%H-%M-%S")
|
|
|
1670 |
assignment_id_input = gr.update(value=None)
|
1671 |
assignment_json = gr.update(value=None)
|
1672 |
|
1673 |
+
return user_data, user_email, user_nickname, \
|
1674 |
admin_group, session_timestamp, request_origin, \
|
1675 |
assignment_id_input, assignment_json, \
|
1676 |
chinese_assignment_row, \
|
|
|
1760 |
|
1761 |
with gr.Row(visible=False) as admin_group:
|
1762 |
user_data = gr.Textbox(label="User Data", value="", elem_id="jutor_user_data_input")
|
1763 |
+
user_email = gr.Textbox(label="User Email", value="", elem_id="jutor_user_email_input")
|
1764 |
user_nickname = gr.Textbox(label="User Nickname", value="", elem_id="jutor_user_nickname_input")
|
1765 |
session_timestamp = gr.Textbox(label="Session Timestamp", value="", elem_id="jutor_session_timestamp_input")
|
1766 |
request_origin = gr.Textbox(label="Request Domain", value="")
|
|
|
2829 |
fn=generate_paragraph_evaluate_history,
|
2830 |
inputs=[
|
2831 |
user_data,
|
2832 |
+
user_email,
|
2833 |
user_nickname,
|
2834 |
session_timestamp,
|
2835 |
request_origin,
|
|
|
3452 |
fn=generate_chinese_paragraph_practice_history,
|
3453 |
inputs=[
|
3454 |
user_data,
|
3455 |
+
user_email,
|
3456 |
user_nickname,
|
3457 |
session_timestamp,
|
3458 |
request_origin,
|
|
|
3646 |
inputs =[],
|
3647 |
outputs = [
|
3648 |
user_data,
|
3649 |
+
user_email,
|
3650 |
+
user_nickname,
|
3651 |
admin_group,
|
3652 |
session_timestamp,
|
3653 |
request_origin,
|
assignment_ui.py
CHANGED
@@ -266,6 +266,12 @@ def create_assignment_ui(user_data, assignment_service, submission_service, dash
|
|
266 |
{submission_json.get('student_name', '未提供')}
|
267 |
</div>
|
268 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
269 |
<div style="margin-bottom: 20px;">
|
270 |
<div style="font-weight: bold; color: #6c757d; margin-bottom: 5px;">🆔 學生ID</div>
|
271 |
<div style="background-color: #f8f9fa; padding: 10px 15px; border-radius: 5px;">
|
|
|
266 |
{submission_json.get('student_name', '未提供')}
|
267 |
</div>
|
268 |
</div>
|
269 |
+
<div style="margin-bottom: 20px;">
|
270 |
+
<div style="font-weight: bold; color: #6c757d; margin-bottom: 5px;">📧 學生Email</div>
|
271 |
+
<div style="background-color: #f8f9fa; padding: 10px 15px; border-radius: 5px;">
|
272 |
+
{submission_json.get('student_email', '未提供')}
|
273 |
+
</div>
|
274 |
+
</div>
|
275 |
<div style="margin-bottom: 20px;">
|
276 |
<div style="font-weight: bold; color: #6c757d; margin-bottom: 5px;">🆔 學生ID</div>
|
277 |
<div style="background-color: #f8f9fa; padding: 10px 15px; border-radius: 5px;">
|
dashboard_service.py
CHANGED
@@ -41,6 +41,7 @@ class DashboardService:
|
|
41 |
submissions.append({
|
42 |
"submission_id": submission_id,
|
43 |
"student_id": submission_data["student_id"],
|
|
|
44 |
"student_name": submission_data["student_name"],
|
45 |
"submission_date": submission_data["timestamp"]
|
46 |
})
|
@@ -76,7 +77,8 @@ class DashboardService:
|
|
76 |
all_submissions.append({
|
77 |
"作業名稱": assignment_data["metadata"]["topic"],
|
78 |
"作業類型": assignment_data["assignment_type"],
|
79 |
-
"學生_id": submission_data["student_id"],
|
|
|
80 |
"學生姓名": submission_data["student_name"],
|
81 |
"繳交日期": submission_data["timestamp"],
|
82 |
"分數": score
|
@@ -87,17 +89,41 @@ class DashboardService:
|
|
87 |
|
88 |
def extract_score(self, submission_data):
|
89 |
try:
|
90 |
-
content = submission_data.get("submission_data", {})
|
91 |
if isinstance(content, str):
|
92 |
content = json.loads(content)
|
93 |
|
94 |
-
|
|
|
|
|
95 |
|
96 |
-
|
97 |
-
|
98 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
99 |
except Exception as e:
|
100 |
print(f"提取分數時出錯:{str(e)}")
|
101 |
-
print(f"提交數據:{submission_data}")
|
102 |
|
|
|
103 |
return "N/A"
|
|
|
41 |
submissions.append({
|
42 |
"submission_id": submission_id,
|
43 |
"student_id": submission_data["student_id"],
|
44 |
+
"student_email": submission_data.get("student_email", "未提供"),
|
45 |
"student_name": submission_data["student_name"],
|
46 |
"submission_date": submission_data["timestamp"]
|
47 |
})
|
|
|
77 |
all_submissions.append({
|
78 |
"作業名稱": assignment_data["metadata"]["topic"],
|
79 |
"作業類型": assignment_data["assignment_type"],
|
80 |
+
# "學生_id": submission_data["student_id"],
|
81 |
+
"學生Email": submission_data.get("student_email", "未提供"),
|
82 |
"學生姓名": submission_data["student_name"],
|
83 |
"繳交日期": submission_data["timestamp"],
|
84 |
"分數": score
|
|
|
89 |
|
90 |
def extract_score(self, submission_data):
|
91 |
try:
|
92 |
+
content = submission_data.get("submission_data", {})
|
93 |
if isinstance(content, str):
|
94 |
content = json.loads(content)
|
95 |
|
96 |
+
if not isinstance(content, dict):
|
97 |
+
print(f"內容格式不正確:{type(content)}")
|
98 |
+
return "N/A"
|
99 |
|
100 |
+
content = content.get("content", {})
|
101 |
+
if isinstance(content, str):
|
102 |
+
content = json.loads(content)
|
103 |
+
|
104 |
+
output_tables = content.get("chinese_full_paragraph_refine_output_table", [])
|
105 |
+
print(f"output_tables: {output_tables}") # 調試輸出
|
106 |
+
last_score = "N/A"
|
107 |
+
|
108 |
+
# 只取最後一個「綜合評分」
|
109 |
+
for table in reversed(output_tables):
|
110 |
+
print(f"檢查 table: {table}") # 調試輸出
|
111 |
+
if isinstance(table, str):
|
112 |
+
try:
|
113 |
+
table = json.loads(table)
|
114 |
+
except json.JSONDecodeError:
|
115 |
+
continue
|
116 |
+
if isinstance(table, dict) and table.get("架構") == "綜合評分":
|
117 |
+
last_score = table.get("評分", "N/A")
|
118 |
+
print(f"找到最後的評分: {last_score}") # 調試輸出
|
119 |
+
break
|
120 |
+
|
121 |
+
return last_score
|
122 |
+
|
123 |
+
except json.JSONDecodeError as e:
|
124 |
+
print(f"JSON 解析錯誤:{str(e)}")
|
125 |
except Exception as e:
|
126 |
print(f"提取分數時出錯:{str(e)}")
|
|
|
127 |
|
128 |
+
print(f"提交數據:{submission_data}")
|
129 |
return "N/A"
|
submission_service.py
CHANGED
@@ -19,7 +19,7 @@ class SubmissionService:
|
|
19 |
if not self.gcs_service.check_file_exists(self.bucket_name, file_name):
|
20 |
return submission_id
|
21 |
|
22 |
-
def submit_assignment(self, assignment_id, student_id, student_name, submission_content, file_name=None, bucket_name=None):
|
23 |
submission_id = self.create_submission_id()
|
24 |
timestamp_now = datetime.now(pytz.utc).astimezone(pytz.timezone('Asia/Taipei')).strftime("%Y-%m-%d %H:%M:%S")
|
25 |
submission_data = {
|
@@ -31,6 +31,7 @@ class SubmissionService:
|
|
31 |
"submission_id": submission_id,
|
32 |
"assignment_id": assignment_id,
|
33 |
"student_id": student_id,
|
|
|
34 |
"student_name": student_name,
|
35 |
"submission_data": submission_data,
|
36 |
"timestamp": timestamp_now
|
|
|
19 |
if not self.gcs_service.check_file_exists(self.bucket_name, file_name):
|
20 |
return submission_id
|
21 |
|
22 |
+
def submit_assignment(self, assignment_id, student_id, student_name, student_email, submission_content, file_name=None, bucket_name=None):
|
23 |
submission_id = self.create_submission_id()
|
24 |
timestamp_now = datetime.now(pytz.utc).astimezone(pytz.timezone('Asia/Taipei')).strftime("%Y-%m-%d %H:%M:%S")
|
25 |
submission_data = {
|
|
|
31 |
"submission_id": submission_id,
|
32 |
"assignment_id": assignment_id,
|
33 |
"student_id": student_id,
|
34 |
+
"student_email": student_email,
|
35 |
"student_name": student_name,
|
36 |
"submission_data": submission_data,
|
37 |
"timestamp": timestamp_now
|