Added WIP Backup System
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
{% extends 'admin/base.html' %}
|
||||
|
||||
{% block extrahead %}
|
||||
{{ block.super }}
|
||||
<style>
|
||||
/* Collapsible diff styles */
|
||||
.diff-list, .diff-list ul { list-style: none; margin-left: 1em; padding-left: 0; }
|
||||
.nested { display: none; }
|
||||
.toggle { cursor: pointer; user-select: none; font-weight: bold; }
|
||||
.new { color: green; }
|
||||
.removed { color: red; }
|
||||
.updated { color: orange; }
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<h1>Backup & Restore</h1>
|
||||
|
||||
<!-- Export backup -->
|
||||
<section>
|
||||
<h2>Download Backup</h2>
|
||||
<form method="get" action="{% url 'settings:export_backup' %}">
|
||||
<button type="submit">Download New Backup</button>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
<hr>
|
||||
|
||||
<!-- Upload backup -->
|
||||
<section>
|
||||
<h2>Upload Backup</h2>
|
||||
<form id="upload-form" method="post" enctype="multipart/form-data" action="">
|
||||
{% csrf_token %}
|
||||
<input type="file" name="backup_file" required>
|
||||
<button type="submit">Upload & Compare Backup</button>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
<hr>
|
||||
|
||||
<!-- Compare summary & diffs -->
|
||||
{% if compare_summary %}
|
||||
<section>
|
||||
<h2>Comparison Summary</h2>
|
||||
<ul>
|
||||
{% for model, counts in compare_summary.items %}
|
||||
<li>{{ model }}: Added {{ counts.add }}, Removed {{ counts.remove }}, Modified {{ counts.modify }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
<h2>Details</h2>
|
||||
{% include "diff_list.html" with items=diffs.suburbs title="Suburbs" %}
|
||||
{% include "diff_list.html" with items=diffs.schools title="Schools" %}
|
||||
{% include "diff_list.html" with items=diffs.travellers title="Travellers" %}
|
||||
{% include "diff_list.html" with items=diffs.companies title="Companies" %}
|
||||
|
||||
<!-- Execute Recovery -->
|
||||
<form method="post" action="">
|
||||
{% csrf_token %}
|
||||
<!-- Pass the uploaded file content for restore -->
|
||||
<input type="hidden" name="backup_content" value="{{ uploaded_file_content|escape }}">
|
||||
<button type="submit" name="execute_restore"
|
||||
onclick="return confirm('Are you sure you want to restore this backup? This cannot be undone.')">
|
||||
Execute Recovery
|
||||
</button>
|
||||
</form>
|
||||
</section>
|
||||
{% endif %}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block extrajs %}
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
// Collapsible diffs
|
||||
document.querySelectorAll('.toggle').forEach(el => {
|
||||
el.addEventListener('click', () => {
|
||||
const nested = el.nextElementSibling;
|
||||
if (nested) nested.style.display = (nested.style.display === "none" || nested.style.display === "") ? "block" : "none";
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user