Files
2026-02-04 13:32:37 +11:00

139 lines
4.5 KiB
Python

import datetime
import json
from django.contrib.admin.views.decorators import staff_member_required
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, serialize_all, compare_backup
from .utils.send_sms import SMSTestForm, send_sms_test
@staff_member_required
def settings(request):
return render(request, 'admin/settings_index.html')
@staff_member_required
def rollover(request):
if request.method == 'POST':
form = RolloverForm(request.POST)
if form.is_valid():
execute_rollover(form.cleaned_data['exit_date'])
return redirect('settings:index')
form = RolloverForm()
return render(request, 'admin/rollover_form.html', context={'form': form})
@staff_member_required
def sms_test(request):
if request.method == 'POST':
form = SMSTestForm(request.POST)
if form.is_valid():
send_sms_test(request)
return redirect('settings:index')
else:
form = SMSTestForm()
return render(request, 'admin/sms_test_form.html', context={'form': form})
@staff_member_required
def nightly_task(request):
nightly_check_active_status()
return redirect('settings:index')
@staff_member_required
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")
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."})