feat: implement import exam answers feature with preview and confirmation steps
This commit is contained in:
@@ -29,6 +29,8 @@
|
||||
<ul class="dropdown-menu" aria-labelledby="navCids">
|
||||
<li><a class="dropdown-item" href="{% url 'generic:manage_cids' %}"><i class="bi bi-file-earmark-text me-1"></i> All Cids</a></li>
|
||||
<li><a class="dropdown-item" href="{% url 'generic:manage_cid_exams' %}"><i class="bi bi-mortarboard me-1"></i> Cids (exams)</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" href="{% url 'generic:import_exam_answers' %}"><i class="bi bi-upload me-1"></i> Import Exam Answers</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
{% extends 'generic/base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container py-4">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-12 col-xl-10">
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-warning text-dark d-flex justify-content-between align-items-center">
|
||||
<h3 class="card-title mb-0">Preview Import Exam Answers</h3>
|
||||
<span class="badge bg-dark text-white fs-6">{{ answers_count }} Answers in file</span>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row mb-4">
|
||||
<div class="col-md-6">
|
||||
<strong>Exam:</strong> <span class="text-primary">{{ eid_str }}</span>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<strong>Candidate/User ID:</strong> <span class="text-primary">{{ cid_str }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p class="text-muted">
|
||||
Review the changes below before confirming the import. Existing database answers will be overwritten.
|
||||
</p>
|
||||
|
||||
<div class="table-responsive" style="max-height: 400px; overflow-y: auto; border: 1px solid #ddd; border-radius: 4px;">
|
||||
<table class="table table-striped table-hover mb-0">
|
||||
<thead class="table-dark sticky-top">
|
||||
<tr>
|
||||
<th>Question ID</th>
|
||||
<th>Part (qidn)</th>
|
||||
<th>File Answer (To Import)</th>
|
||||
<th>Database Answer (To Overwrite)</th>
|
||||
<th>Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for item in preview_items %}
|
||||
<tr>
|
||||
<td>{{ item.qid }}</td>
|
||||
<td>{{ item.qidn }}</td>
|
||||
<td><code class="text-success">{{ item.posted }}</code></td>
|
||||
<td>
|
||||
{% if item.existing %}
|
||||
<code class="text-danger">{{ item.existing }}</code>
|
||||
{% else %}
|
||||
<span class="text-muted italic">- None -</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{% if item.action == "Update" %}
|
||||
<span class="badge bg-warning text-dark">Overwrite (Update)</span>
|
||||
{% else %}
|
||||
<span class="badge bg-success">New (Create)</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<form method="post" class="mt-4">
|
||||
{% csrf_token %}
|
||||
<input type="hidden" name="confirm" value="1">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<a href="{% url 'generic:import_exam_answers' %}" class="btn btn-secondary">Cancel</a>
|
||||
<button type="submit" class="btn btn-success px-4 fw-bold">Confirm Import</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,50 @@
|
||||
{% extends 'generic/base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container py-4">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-8 col-lg-6">
|
||||
<div class="card shadow border-success">
|
||||
<div class="card-header bg-success text-white">
|
||||
<h3 class="card-title mb-0">Import Successful</h3>
|
||||
</div>
|
||||
<div class="card-body text-center">
|
||||
<div class="mb-4">
|
||||
<i class="bi bi-check-circle-fill text-success" style="font-size: 4rem;"></i>
|
||||
</div>
|
||||
|
||||
<h4 class="mb-3">Answers Imported Successfully</h4>
|
||||
|
||||
<div class="bg-light p-3 rounded mb-4 text-start">
|
||||
<div class="row mb-2">
|
||||
<div class="col-6 text-muted">Exam:</div>
|
||||
<div class="col-6 fw-bold">{{ eid_str }}</div>
|
||||
</div>
|
||||
<div class="row mb-2">
|
||||
<div class="col-6 text-muted">Candidate/User ID:</div>
|
||||
<div class="col-6 fw-bold">{{ cid_str }}</div>
|
||||
</div>
|
||||
<div class="row mb-2 border-top pt-2">
|
||||
<div class="col-6 text-muted">Created (New):</div>
|
||||
<div class="col-6 fw-bold text-success">{{ created_count }}</div>
|
||||
</div>
|
||||
<div class="row mb-2">
|
||||
<div class="col-6 text-muted">Updated (Overwritten):</div>
|
||||
<div class="col-6 fw-bold text-warning">{{ updated_count }}</div>
|
||||
</div>
|
||||
<div class="row border-top pt-2">
|
||||
<div class="col-6 text-muted">Total Processed:</div>
|
||||
<div class="col-6 fw-bold text-primary">{{ total_count }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="d-grid gap-2">
|
||||
<a href="{% url 'generic:manage_cids' %}" class="btn btn-primary">Go to Candidate Management</a>
|
||||
<a href="{% url 'generic:import_exam_answers' %}" class="btn btn-outline-secondary">Import Another File</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user