diff --git a/backup/views.py b/backup/views.py index e9df321..091907c 100644 --- a/backup/views.py +++ b/backup/views.py @@ -14,6 +14,7 @@ import unicodedata from routerlib.functions import gen_backup_name, get_router_backup_file_extension from django.conf import settings from user_manager.models import UserAcl +from django.utils import timezone @login_required() @@ -93,6 +94,14 @@ def view_backup_details(request): if not UserAcl.objects.filter(user=request.user).filter(user_level__gte=20).exists(): return render(request, 'access_denied.html', {'page_title': 'Access Denied'}) backup = get_object_or_404(RouterBackup, uuid=request.GET.get('uuid')) + if request.GET.get('action') == 'anticipate': + if not backup.success and not backup.error: + backup.next_retry = timezone.now() + backup.save() + messages.success(request, 'Backup task anticipated|Backup task will be retried shortly') + else: + messages.warning(request, 'Backup task not anticipated|Task is already completed') + return redirect(f'/backup/backup_details/?uuid={backup.uuid}') hash_list = [backup.backup_text_hash] backup_list = [] for backup_item in RouterBackup.objects.filter(router=backup.router, success=True).order_by('-created'): @@ -104,7 +113,9 @@ def view_backup_details(request): 'backup': backup, 'backup_list': backup_list, 'page_title': 'Backup Details', - 'webadmin_settings': webadmin_settings + 'webadmin_settings': webadmin_settings, + 'now': timezone.now(), + '5_minutes_ago': timezone.now() - timezone.timedelta(minutes=5), } return render(request, 'backup/backup_details.html', context) @@ -188,10 +199,15 @@ def view_backup_delete(request): if not UserAcl.objects.filter(user=request.user).filter(user_level__gte=30).exists(): return render(request, 'access_denied.html', {'page_title': 'Access Denied'}) backup = get_object_or_404(RouterBackup, uuid=request.GET.get('uuid')) + router = backup.router redirect_url = f'/router/details/?uuid={backup.router.uuid}' if request.GET.get('confirmation') == f'delete{backup.id}': backup.delete() messages.success(request, 'Backup deleted successfully') + if router.routerstatus.backup_lock: + if not RouterBackup.objects.filter(router=router, success=False, error=False).exists(): + router.routerstatus.backup_lock = None + router.routerstatus.save() return redirect(redirect_url) else: messages.warning(request, 'Backup not deleted|Invalid confirmation') diff --git a/router_manager/views.py b/router_manager/views.py index a1e67f5..9eb3ec2 100644 --- a/router_manager/views.py +++ b/router_manager/views.py @@ -35,12 +35,21 @@ def view_router_list(request): def view_router_details(request): router = get_object_or_404(Router, uuid=request.GET.get('uuid')) router_status, _ = RouterStatus.objects.get_or_create(router=router) + router_backup_list = router.routerbackup_set.all().order_by('-created') + if router_status.backup_lock: + if not router_backup_list.filter(success=False, error=False).exists(): + router_status.backup_lock = None + router_status.save() + messages.warning(request, 'Backup lock removed|Backup lock was removed as there are no active backup tasks') + context = { 'router': router, 'router_status': router_status, - 'router_backup_list': router.routerbackup_set.all().order_by('-created'), + 'router_backup_list': router_backup_list, 'page_title': 'Router Details', } + + return render(request, 'router_manager/router_details.html', context=context) diff --git a/routerfleet/settings.py b/routerfleet/settings.py index 08646dd..b4a5d2a 100644 --- a/routerfleet/settings.py +++ b/routerfleet/settings.py @@ -140,6 +140,6 @@ STATICFILES_DIRS = [ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' MEDIA_ROOT = '/var/lib/routerfleet/' -ROUTERFLEET_VERSION = 7003 +ROUTERFLEET_VERSION = 7004 from routerfleet.production_settings import * diff --git a/templates/backup/backup_details.html b/templates/backup/backup_details.html index cf6b85b..02c4e58 100644 --- a/templates/backup/backup_details.html +++ b/templates/backup/backup_details.html @@ -37,29 +37,29 @@ {{ backup.id }} - - - {% if not backup.success and not backup.error %} -