Added WIP Backup System
This commit is contained in:
@@ -2,13 +2,13 @@ import datetime
|
||||
import json
|
||||
|
||||
from django.contrib.admin.views.decorators import staff_member_required
|
||||
from django.http import HttpResponse
|
||||
from django.http import HttpResponse, JsonResponse
|
||||
from django.shortcuts import render, redirect
|
||||
|
||||
from .scheduled_tasks import nightly_check_active_status
|
||||
from .utils.rollover import RolloverForm, execute_rollover
|
||||
|
||||
from .backup.backup_helpers import get_export_dict
|
||||
from .backup.backup_helpers import get_export_dict, serialize_all, compare_backup
|
||||
from .utils.send_sms import SMSTestForm, send_sms_test
|
||||
|
||||
|
||||
@@ -49,8 +49,91 @@ def nightly_task(request):
|
||||
|
||||
|
||||
@staff_member_required
|
||||
def export(request):
|
||||
def backup(request):
|
||||
if request.method == "POST" and request.FILES.get("backup_file"):
|
||||
uploaded_file = request.FILES["backup_file"]
|
||||
request.session["backup_file"] = {
|
||||
"content": uploaded_file.read().decode("utf-8"),
|
||||
"timestamp": datetime.datetime.now().timestamp(),
|
||||
}
|
||||
return JsonResponse({"status": "success", "message": "Backup uploaded."})
|
||||
return render(request, "admin/backup.html")
|
||||
|
||||
|
||||
@staff_member_required
|
||||
def export_backup(request):
|
||||
date = datetime.date.today().strftime("%Y-%m-%d")
|
||||
response = HttpResponse(json.dumps(get_export_dict()))
|
||||
response['Content-Disposition'] = f'attachment; filename=busportal_export-{date}.json'
|
||||
data = serialize_all()
|
||||
|
||||
response = HttpResponse(
|
||||
json.dumps(data, indent=2), # pretty print for readability
|
||||
content_type="application/json",
|
||||
)
|
||||
response["Content-Disposition"] = f'attachment; filename="busportal_export-{date}.json"'
|
||||
return response
|
||||
|
||||
|
||||
def backup_view(request):
|
||||
context = {}
|
||||
|
||||
if request.method == "POST":
|
||||
if "backup_file" in request.FILES:
|
||||
uploaded_file = request.FILES["backup_file"]
|
||||
# Read JSON content from uploaded file
|
||||
backup_content = uploaded_file.read().decode("utf-8")
|
||||
|
||||
# Compare backup with current DB state
|
||||
summary, diffs = compare_backup(backup_content)
|
||||
context["compare_summary"] = summary
|
||||
context["diffs"] = diffs
|
||||
context["uploaded_file_name"] = uploaded_file.name
|
||||
|
||||
elif "execute_restore" in request.POST:
|
||||
# You can pass the JSON content in a hidden input if needed
|
||||
backup_content = request.POST.get("backup_content")
|
||||
# restore_backup(backup_content)
|
||||
context["success_message"] = "Backup restored successfully."
|
||||
|
||||
return render(request, "backup.html", context)
|
||||
|
||||
@staff_member_required
|
||||
|
||||
|
||||
@staff_member_required
|
||||
def upload_backup_view(request):
|
||||
if request.method == 'POST' and request.FILES.get("backup_file"):
|
||||
uploaded_file = request.FILES["backup_file"]
|
||||
request.session["backup_file_content"] = uploaded_file.read().decode("utf-8")
|
||||
return JsonResponse({"status": "success", "message": "File uploaded successfully"})
|
||||
return render(request, 'admin/upload_backup_view.html')
|
||||
|
||||
|
||||
# --- Delete uploaded backup ---
|
||||
def cancel_backup_upload(request):
|
||||
request.session.pop("backup_file", None)
|
||||
return JsonResponse({"status": "success", "message": "Uploaded backup cleared."})
|
||||
|
||||
|
||||
# --- Compare backup ---
|
||||
def compare_backup_view(request):
|
||||
backup_entry = request.session.get("backup_file")
|
||||
if not backup_entry:
|
||||
return JsonResponse({"error": "No backup uploaded."}, status=400)
|
||||
|
||||
backup_data = backup_entry["content"]
|
||||
|
||||
summary, details = compare_backup(backup_data)
|
||||
return render(request, "backup_compare.html", {"summary": summary, "details": details})
|
||||
|
||||
def apply_backup(backup_data):
|
||||
pass
|
||||
|
||||
# --- Execute restore ---
|
||||
def restore_backup_view(request):
|
||||
backup_entry = request.session.pop("backup_file", None)
|
||||
if not backup_entry:
|
||||
return JsonResponse({"error": "No backup uploaded."}, status=400)
|
||||
|
||||
backup_data = json.loads(backup_entry["content"])
|
||||
apply_backup(backup_data)
|
||||
return JsonResponse({"status": "success", "message": "Backup restored successfully."})
|
||||
Reference in New Issue
Block a user