feat: add weekly schedule management page with Drag-and-Drop support and custom context processors
This commit is contained in:
parent
7b5abd244f
commit
89428f773b
2 changed files with 252 additions and 214 deletions
|
|
@ -1,9 +1,14 @@
|
||||||
|
from django.utils import translation
|
||||||
|
|
||||||
def language_processor(request):
|
def language_processor(request):
|
||||||
"""
|
"""
|
||||||
Context processor to make current_lang available across all template renders.
|
Context processor to make current_lang available across all template renders.
|
||||||
|
Also activates Django's gettext translation so {% trans %} tags render correctly.
|
||||||
Defaults to 'zh' (Traditional Chinese).
|
Defaults to 'zh' (Traditional Chinese).
|
||||||
"""
|
"""
|
||||||
lang = request.session.get('lang', 'zh')
|
lang = request.session.get('lang', 'zh')
|
||||||
|
target_lang = 'en' if lang == 'en' else 'zh-hant'
|
||||||
|
translation.activate(target_lang)
|
||||||
return {
|
return {
|
||||||
'current_lang': lang
|
'current_lang': lang
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,8 @@
|
||||||
{% if user.is_authenticated %}
|
{% if user.is_authenticated %}
|
||||||
<form method="post" action="{% url 'verify_schedule_rules' %}" class="d-inline">
|
<form method="post" action="{% url 'verify_schedule_rules' %}" class="d-inline">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<button type="submit" class="btn btn-warning btn-sm shadow-sm text-dark fw-bold" onclick="return confirm('確定要校正並驗證排程規則嗎?(如為交換生將自動刪除其卡片,並清理重複或補齊缺漏排程)');">
|
<button type="submit" class="btn btn-warning btn-sm shadow-sm text-dark fw-bold"
|
||||||
|
onclick="return confirm('確定要校正並驗證排程規則嗎?(如為交換生將自動刪除其卡片,並清理重複或補齊缺漏排程)');">
|
||||||
<i class="fas fa-check-double me-1"></i>{% trans "校正並驗證排程規則" %}
|
<i class="fas fa-check-double me-1"></i>{% trans "校正並驗證排程規則" %}
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
|
|
@ -59,6 +60,11 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="alert alert-info small mb-4 shadow-sm rounded-3 border-start border-4 border-info">
|
||||||
|
<i class="fas fa-hand-pointer text-primary me-2"></i>
|
||||||
|
<strong>{% trans "經調整後但仍未能報告者,須準備一小時之進度簡報,當週向指導教授當面報告,次週週會補報。若連續兩次應報告而未報告,將視同解除指導關係。" %}</strong>
|
||||||
|
</div>
|
||||||
|
|
||||||
{% if user.is_authenticated %}
|
{% if user.is_authenticated %}
|
||||||
<div class="alert alert-info small mb-4 shadow-sm rounded-3 border-start border-4 border-info">
|
<div class="alert alert-info small mb-4 shadow-sm rounded-3 border-start border-4 border-info">
|
||||||
<i class="fas fa-hand-pointer text-primary me-2"></i>
|
<i class="fas fa-hand-pointer text-primary me-2"></i>
|
||||||
|
|
@ -79,7 +85,8 @@
|
||||||
<div class="row g-4">
|
<div class="row g-4">
|
||||||
{% for item in schedule_m1 %}
|
{% for item in schedule_m1 %}
|
||||||
<div class="col-lg-6">
|
<div class="col-lg-6">
|
||||||
<div class="card shadow-sm border-0 rounded-3 h-100 monday-drop-target" data-date="{{ item.formatted }}" style="transition: all 0.2s ease-in-out;">
|
<div class="card shadow-sm border-0 rounded-3 h-100 monday-drop-target" data-date="{{ item.formatted }}"
|
||||||
|
style="transition: all 0.2s ease-in-out;">
|
||||||
<div class="card-header bg-primary text-white d-flex justify-content-between align-items-center py-3">
|
<div class="card-header bg-primary text-white d-flex justify-content-between align-items-center py-3">
|
||||||
<h5 class="mb-0 fw-bold">
|
<h5 class="mb-0 fw-bold">
|
||||||
<i class="fas fa-calendar-check me-2"></i>{{ item.formatted }} (星期一)
|
<i class="fas fa-calendar-check me-2"></i>{{ item.formatted }} (星期一)
|
||||||
|
|
@ -100,26 +107,38 @@
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for student in item.students %}
|
{% for student in item.students %}
|
||||||
<tr {% if user.is_authenticated %}draggable="true" class="draggable-student" style="cursor: grab;" data-student-id="{{ student.student_id }}" data-student-name="{{ student.name }}" data-from-date="{{ item.formatted }}"{% endif %}>
|
{% if user.is_authenticated %}
|
||||||
|
<tr draggable="true" class="draggable-student" style="cursor: grab;"
|
||||||
|
data-student-id="{{ student.student_id }}" data-student-name="{{ student.name }}"
|
||||||
|
data-from-date="{{ item.formatted }}">
|
||||||
|
{% else %}
|
||||||
|
<tr>
|
||||||
|
{% endif %}
|
||||||
<td class="fw-bold">
|
<td class="fw-bold">
|
||||||
{% if user.is_authenticated %}<i class="fas fa-grip-vertical text-muted me-2"></i>{% endif %}
|
{% if user.is_authenticated %}<i
|
||||||
|
class="fas fa-grip-vertical text-muted me-2"></i>{% endif %}
|
||||||
<code>{{ student.student_id }}</code>
|
<code>{{ student.student_id }}</code>
|
||||||
</td>
|
</td>
|
||||||
<td>{{ student.name }}</td>
|
<td>{{ student.name }}</td>
|
||||||
<td>
|
<td>
|
||||||
{% if student.degree_type == '博士生' %}
|
{% if student.degree_type == '博士生' %}
|
||||||
<span class="badge bg-danger text-white"><i class="fas fa-user-graduate me-1"></i>博士生</span>
|
<span class="badge bg-danger text-white"><i
|
||||||
|
class="fas fa-user-graduate me-1"></i>博士生</span>
|
||||||
{% else %}
|
{% else %}
|
||||||
<span class="badge bg-info text-dark"><i class="fas fa-graduation-cap me-1"></i>碩士生</span>
|
<span class="badge bg-info text-dark"><i
|
||||||
|
class="fas fa-graduation-cap me-1"></i>碩士生</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{% if student.student_category == '在職生' %}
|
{% if student.student_category == '在職生' %}
|
||||||
<span class="badge bg-warning text-dark"><i class="fas fa-user-tie me-1"></i>在職生</span>
|
<span class="badge bg-warning text-dark"><i
|
||||||
|
class="fas fa-user-tie me-1"></i>在職生</span>
|
||||||
{% elif student.student_category == '交換中' %}
|
{% elif student.student_category == '交換中' %}
|
||||||
<span class="badge bg-secondary text-white"><i class="fas fa-exchange-alt me-1"></i>交換中</span>
|
<span class="badge bg-secondary text-white"><i
|
||||||
|
class="fas fa-exchange-alt me-1"></i>交換中</span>
|
||||||
{% else %}
|
{% else %}
|
||||||
<span class="badge bg-success text-white"><i class="fas fa-user me-1"></i>一般生</span>
|
<span class="badge bg-success text-white"><i
|
||||||
|
class="fas fa-user me-1"></i>一般生</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
@ -145,7 +164,8 @@
|
||||||
<div class="row g-4">
|
<div class="row g-4">
|
||||||
{% for item in schedule_m2 %}
|
{% for item in schedule_m2 %}
|
||||||
<div class="col-lg-6">
|
<div class="col-lg-6">
|
||||||
<div class="card shadow-sm border-0 rounded-3 h-100 monday-drop-target" data-date="{{ item.formatted }}" style="transition: all 0.2s ease-in-out;">
|
<div class="card shadow-sm border-0 rounded-3 h-100 monday-drop-target" data-date="{{ item.formatted }}"
|
||||||
|
style="transition: all 0.2s ease-in-out;">
|
||||||
<div class="card-header bg-success text-white d-flex justify-content-between align-items-center py-3">
|
<div class="card-header bg-success text-white d-flex justify-content-between align-items-center py-3">
|
||||||
<h5 class="mb-0 fw-bold">
|
<h5 class="mb-0 fw-bold">
|
||||||
<i class="fas fa-calendar-check me-2"></i>{{ item.formatted }} (星期一)
|
<i class="fas fa-calendar-check me-2"></i>{{ item.formatted }} (星期一)
|
||||||
|
|
@ -166,26 +186,38 @@
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for student in item.students %}
|
{% for student in item.students %}
|
||||||
<tr {% if user.is_authenticated %}draggable="true" class="draggable-student" style="cursor: grab;" data-student-id="{{ student.student_id }}" data-student-name="{{ student.name }}" data-from-date="{{ item.formatted }}"{% endif %}>
|
{% if user.is_authenticated %}
|
||||||
|
<tr draggable="true" class="draggable-student" style="cursor: grab;"
|
||||||
|
data-student-id="{{ student.student_id }}" data-student-name="{{ student.name }}"
|
||||||
|
data-from-date="{{ item.formatted }}">
|
||||||
|
{% else %}
|
||||||
|
<tr>
|
||||||
|
{% endif %}
|
||||||
<td class="fw-bold">
|
<td class="fw-bold">
|
||||||
{% if user.is_authenticated %}<i class="fas fa-grip-vertical text-muted me-2"></i>{% endif %}
|
{% if user.is_authenticated %}<i
|
||||||
|
class="fas fa-grip-vertical text-muted me-2"></i>{% endif %}
|
||||||
<code>{{ student.student_id }}</code>
|
<code>{{ student.student_id }}</code>
|
||||||
</td>
|
</td>
|
||||||
<td>{{ student.name }}</td>
|
<td>{{ student.name }}</td>
|
||||||
<td>
|
<td>
|
||||||
{% if student.degree_type == '博士生' %}
|
{% if student.degree_type == '博士生' %}
|
||||||
<span class="badge bg-danger text-white"><i class="fas fa-user-graduate me-1"></i>博士生</span>
|
<span class="badge bg-danger text-white"><i
|
||||||
|
class="fas fa-user-graduate me-1"></i>博士生</span>
|
||||||
{% else %}
|
{% else %}
|
||||||
<span class="badge bg-info text-dark"><i class="fas fa-graduation-cap me-1"></i>碩士生</span>
|
<span class="badge bg-info text-dark"><i
|
||||||
|
class="fas fa-graduation-cap me-1"></i>碩士生</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{% if student.student_category == '在職生' %}
|
{% if student.student_category == '在職生' %}
|
||||||
<span class="badge bg-warning text-dark"><i class="fas fa-user-tie me-1"></i>在職生</span>
|
<span class="badge bg-warning text-dark"><i
|
||||||
|
class="fas fa-user-tie me-1"></i>在職生</span>
|
||||||
{% elif student.student_category == '交換中' %}
|
{% elif student.student_category == '交換中' %}
|
||||||
<span class="badge bg-secondary text-white"><i class="fas fa-exchange-alt me-1"></i>交換中</span>
|
<span class="badge bg-secondary text-white"><i
|
||||||
|
class="fas fa-exchange-alt me-1"></i>交換中</span>
|
||||||
{% else %}
|
{% else %}
|
||||||
<span class="badge bg-success text-white"><i class="fas fa-user me-1"></i>一般生</span>
|
<span class="badge bg-success text-white"><i
|
||||||
|
class="fas fa-user me-1"></i>一般生</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
@ -229,7 +261,8 @@
|
||||||
<td>
|
<td>
|
||||||
{% if row.assigned_dates %}
|
{% if row.assigned_dates %}
|
||||||
{% for d in row.assigned_dates %}
|
{% for d in row.assigned_dates %}
|
||||||
<span class="badge bg-primary me-1 mb-1"><i class="far fa-calendar-alt me-1"></i>{{ d }}</span>
|
<span class="badge bg-primary me-1 mb-1"><i class="far fa-calendar-alt me-1"></i>{{ d
|
||||||
|
}}</span>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% else %}
|
{% else %}
|
||||||
<span class="badge bg-secondary"><i class="fas fa-minus-circle me-1"></i>免報告</span>
|
<span class="badge bg-secondary"><i class="fas fa-minus-circle me-1"></i>免報告</span>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue