Front end loading of backup edit page

This commit is contained in:
amcmanu3 2024-04-21 11:26:16 -04:00
parent f2e00040bd
commit eebf68a376
5 changed files with 161 additions and 193 deletions

View File

@ -178,8 +178,8 @@ class ManagementController:
# Backups Methods # Backups Methods
# ********************************************************************************** # **********************************************************************************
@staticmethod @staticmethod
def get_backup_config(server_id): def get_backup_config(backup_id):
return HelpersManagement.get_backup_config(server_id) return HelpersManagement.get_backup_config(backup_id)
@staticmethod @staticmethod
def get_backups_by_server(server_id, model=False): def get_backups_by_server(server_id, model=False):
@ -212,8 +212,8 @@ class ManagementController:
) )
@staticmethod @staticmethod
def get_excluded_backup_dirs(server_id: int): def get_excluded_backup_dirs(backup_id: int):
return HelpersManagement.get_excluded_backup_dirs(server_id) return HelpersManagement.get_excluded_backup_dirs(backup_id)
def add_excluded_backup_dir(self, server_id: int, dir_to_add: str): def add_excluded_backup_dir(self, server_id: int, dir_to_add: str):
self.management_helper.add_excluded_backup_dir(server_id, dir_to_add) self.management_helper.add_excluded_backup_dir(server_id, dir_to_add)

View File

@ -455,7 +455,7 @@ class HelpersManagement:
dir_list = [] dir_list = []
return dir_list return dir_list
def add_excluded_backup_dir(self, server_id: int, dir_to_add: str): def add_excluded_backup_dir(self, server_id: str, dir_to_add: str):
dir_list = self.get_excluded_backup_dirs(server_id) dir_list = self.get_excluded_backup_dirs(server_id)
if dir_to_add not in dir_list: if dir_to_add not in dir_list:
dir_list.append(dir_to_add) dir_list.append(dir_to_add)
@ -467,7 +467,7 @@ class HelpersManagement:
f"already in the excluded directory list for server ID {server_id}" f"already in the excluded directory list for server ID {server_id}"
) )
def del_excluded_backup_dir(self, server_id: int, dir_to_del: str): def del_excluded_backup_dir(self, server_id: str, dir_to_del: str):
dir_list = self.get_excluded_backup_dirs(server_id) dir_list = self.get_excluded_backup_dirs(server_id)
if dir_to_del in dir_list: if dir_to_del in dir_list:
dir_list.remove(dir_to_del) dir_list.remove(dir_to_del)

View File

@ -1243,7 +1243,66 @@ class PanelHandler(BaseHandler):
template = "panel/server_schedule_edit.html" template = "panel/server_schedule_edit.html"
elif page == "edit_backup": elif page == "edit_backup":
server_id = self.get_argument("id", None)
backup_id = self.get_argument("backup_id", None)
page_data["active_link"] = "backups"
page_data["permissions"] = {
"Commands": EnumPermissionsServer.COMMANDS,
"Terminal": EnumPermissionsServer.TERMINAL,
"Logs": EnumPermissionsServer.LOGS,
"Schedule": EnumPermissionsServer.SCHEDULE,
"Backup": EnumPermissionsServer.BACKUP,
"Files": EnumPermissionsServer.FILES,
"Config": EnumPermissionsServer.CONFIG,
"Players": EnumPermissionsServer.PLAYERS,
}
if not self.failed_server:
server_obj = self.controller.servers.get_server_instance_by_id(
server_id
)
page_data["backup_failed"] = server_obj.last_backup_status()
page_data["user_permissions"] = (
self.controller.server_perms.get_user_id_permissions_list(
exec_user["user_id"], server_id
)
)
server_info = self.controller.servers.get_server_data_by_id(server_id)
page_data["backup_config"] = self.controller.management.get_backup_config(
backup_id
)
page_data["backups"] = self.controller.management.get_backups_by_server(
server_id, model=True
)
exclusions = [] exclusions = []
page_data["backing_up"] = self.controller.servers.get_server_instance_by_id(
server_id
).is_backingup
page_data["backup_stats"] = (
self.controller.servers.get_server_instance_by_id(
server_id
).send_backup_status()
)
self.controller.servers.refresh_server_settings(server_id)
try:
page_data["backup_list"] = server.list_backups()
except:
page_data["backup_list"] = []
page_data["backup_path"] = Helpers.wtol_path(
page_data["backup_config"]["backup_location"]
)
page_data["server_data"] = self.controller.servers.get_server_data_by_id(
server_id
)
page_data["server_stats"] = self.controller.servers.get_server_stats_by_id(
server_id
)
page_data["server_stats"]["server_type"] = (
self.controller.servers.get_server_type_by_id(server_id)
)
page_data["exclusions"] = (
self.controller.management.get_excluded_backup_dirs(backup_id)
)
# Make exclusion paths relative for page
for file in page_data["exclusions"]: for file in page_data["exclusions"]:
if Helpers.is_os_windows(): if Helpers.is_os_windows():
exclusions.append(file.replace(server_info["path"] + "\\", "")) exclusions.append(file.replace(server_info["path"] + "\\", ""))
@ -1251,6 +1310,12 @@ class PanelHandler(BaseHandler):
exclusions.append(file.replace(server_info["path"] + "/", "")) exclusions.append(file.replace(server_info["path"] + "/", ""))
page_data["exclusions"] = exclusions page_data["exclusions"] = exclusions
if not EnumPermissionsServer.BACKUP in page_data["user_permissions"]:
if not superuser:
self.redirect("/panel/error?error=Unauthorized access To Schedules")
return
template = "panel/server_backup_edit.html"
elif page == "edit_user": elif page == "edit_user":
user_id = self.get_argument("id", None) user_id = self.get_argument("id", None)
role_servers = self.controller.servers.get_authorized_servers(user_id) role_servers = self.controller.servers.get_authorized_servers(user_id)

View File

@ -85,7 +85,8 @@
<tr> <tr>
<td id="{{backup.enabled}}" class="enabled"> <td id="{{backup.enabled}}" class="enabled">
<button type="button" class="btn btn-sm btn-info btn-toggle backup-custom-toggle" <button type="button" class="btn btn-sm btn-info btn-toggle backup-custom-toggle"
id="backup_{{backup.id}}" name="backup_{{backup.id}}" data-backup-id="{{backup.id}}" id="backup_{{backup.backup_id}}" name="backup_{{backup.backup_id}}"
data-backup-id="{{backup.backup_id}}"
data-backup-enabled="{{ 'true' if backup.enabled else 'false' }}" data-toggle="button" data-backup-enabled="{{ 'true' if backup.enabled else 'false' }}" data-toggle="button"
aria-pressed="true" autocomplete="off"> aria-pressed="true" autocomplete="off">
<div class="handle"></div> <div class="handle"></div>
@ -102,14 +103,14 @@
</td> </td>
<td id="backup_edit" class="action"> <td id="backup_edit" class="action">
<button <button
onclick="window.location.href=`/panel/backup_edit?id={{ data['server_stats']['server_id']['server_id'] }}&backup_id={{backup.id}}`" onclick="window.location.href=`/panel/edit_backup?id={{ data['server_stats']['server_id']['server_id'] }}&backup_id={{backup.backup_id}}`"
class="btn btn-info"> class="btn btn-info">
<i class="fas fa-pencil-alt"></i> <i class="fas fa-pencil-alt"></i>
</button> </button>
<button data-backup={{ backup.id }} class="btn btn-danger del_button"> <button data-backup={{ backup.backup_id }} class="btn btn-danger del_button">
<i class="fas fa-trash" aria-hidden="true"></i> <i class="fas fa-trash" aria-hidden="true"></i>
</button> </button>
<button data-backup={{ backup.id }} data-toggle="tooltip" <button data-backup={{ backup.backup_id }} data-toggle="tooltip"
title="{{ translate('serverBackups', 'run', data['lang']) }}" title="{{ translate('serverBackups', 'run', data['lang']) }}"
class="btn btn-outline-warning test-socket"> class="btn btn-outline-warning test-socket">
<i class="fa-solid fa-vial"></i> <i class="fa-solid fa-vial"></i>
@ -138,7 +139,8 @@
<tr> <tr>
<td id="{{backup.enabled}}" class="enabled"> <td id="{{backup.enabled}}" class="enabled">
<button type="button" class="btn btn-sm btn-info btn-toggle backup-custom-toggle" <button type="button" class="btn btn-sm btn-info btn-toggle backup-custom-toggle"
id="backup_{{backup.id}}" name="backup_{{backup.id}}" data-backup-id="{{backup.id}}" id="backup_{{backup.backup_id}}" name="backup_{{backup.backup_id}}"
data-backup-id="{{backup.backup_id}}"
data-backup-enabled="{{ 'true' if backup.enabled else 'false' }}" data-toggle="button" data-backup-enabled="{{ 'true' if backup.enabled else 'false' }}" data-toggle="button"
aria-pressed="true" autocomplete="off"> aria-pressed="true" autocomplete="off">
<div class="handle"></div> <div class="handle"></div>
@ -149,7 +151,7 @@
</td> </td>
<td id="backup_edit" class="action"> <td id="backup_edit" class="action">
<button <button
onclick="window.location.href=`/panel/backup_edit?id={{ data['server_stats']['server_id']['server_id'] }}&backup_id={{backup.id}}`" onclick="window.location.href=`/panel/edit_backup?id={{ data['server_stats']['server_id']['server_id'] }}&backup_id={{backup.backup_id}}`"
class="btn btn-info"> class="btn btn-info">
<i class="fas fa-pencil-alt"></i> <i class="fas fa-pencil-alt"></i>
</button> </button>

View File

@ -39,111 +39,6 @@
<span class="d-block d-sm-none"> <span class="d-block d-sm-none">
{% include "parts/m_server_controls_list.html %} {% include "parts/m_server_controls_list.html %}
</span> </span>
<div class="row">
<div class="col-md-12 col-sm-12" style="overflow-x:auto;">
<div class="card">
<div class="card-header header-sm d-flex justify-content-between align-items-center">
<h4 class="card-title"><i class="fa-regular fa-bell"></i> {{ translate('serverBackups', 'backups', data['lang']) }} </h4>
{% if data['user_data']['hints'] %}
<span class="too_small" title="{{ translate('serverSchedules', 'cannotSee', data['lang']) }}" , data-content="{{ translate('serverSchedules', 'cannotSeeOnMobile', data['lang']) }}" , data-placement="bottom"></span>
{% end %}
<div><a class="btn btn-info" href="/panel/add_backup?id={{ data['server_stats']['server_id']['server_id'] }}"><i class="fas fa-plus-circle"></i> {{ translate('serverBackups', 'newBackup', data['lang']) }}</a></div>
</div>
<div class="card-body">
{% if len(data['backups']) == 0 %}
<div style="text-align: center; color: grey;">
<h7>{{ translate('serverBackups', 'no-backup', data['lang']) }} <strong>{{ translate('serverBackups', 'newBackup',data['lang']) }}</strong>.</h7>
</div>
{% end %}
{% if len(data['backups']) > 0 %}
<div class="d-none d-lg-block">
<table class="table table-hover responsive-table" aria-label="backups list" id="backup_table" width="100%" style="table-layout:fixed;">
<thead>
<tr class="rounded">
<th scope="col" style="width: 5%; min-width: 64px;">{{ translate('serverBackups', 'enabled', data['lang']) }}</th>
<th scope="col" style="width: 15%; min-width: 10px;">{{ translate('serverBackups', 'name', data['lang']) }} </th>
<th scope="col" style="width: 60%; min-width: 50px;">{{ translate('serverBackups', 'storageLocation', data['lang']) }}</th>
<th scope="col" style="width: 10%; min-width: 50px;">{{ translate('serverBackups', 'maxBackups', data['lang']) }}</th>
<th scope="col" style="width: 10%; min-width: 50px;">{{ translate('serverBackups', 'actions', data['lang']) }}</th>
</tr>
</thead>
<tbody>
{% for backup in data['backups'] %}
<tr>
<td id="{{backup.enabled}}" class="enabled">
<button type="button" class="btn btn-sm btn-info btn-toggle backup-custom-toggle" id="backup_{{backup.id}}" name="backup_{{backup.id}}" data-backup-id="{{backup.id}}" data-backup-enabled="{{ 'true' if backup.enabled else 'false' }}" data-toggle="button" aria-pressed="true" autocomplete="off">
<div class="handle"></div>
</button>
</td>
<td id="{{backup.backup_name}}" class="id">
<p>{{backup.backup_name}}</p>
</td>
<td id="{{backup.backup_location}}" class="type">
<p>{{backup.backup_location}}</p>
</td>
<td id="{{backup.max_backups}}" class="trigger" style="overflow: scroll; max-width: 30px;">
<p>{{backup.max_backups}}</p>
</td>
<td id="backup_edit" class="action">
<button onclick="window.location.href=`/panel/backup_edit?id={{ data['server_stats']['server_id']['server_id'] }}&backup_id={{backup.id}}`" class="btn btn-info">
<i class="fas fa-pencil-alt"></i>
</button>
<button data-backup={{ backup.id }} class="btn btn-danger del_button">
<i class="fas fa-trash" aria-hidden="true"></i>
</button>
<button data-backup={{ backup.id }} data-toggle="tooltip" title="{{ translate('serverBackups', 'run', data['lang']) }}" class="btn btn-outline-warning test-socket">
<i class="fa-solid fa-vial"></i>
</button>
</td>
</tr>
{% end %}
</tbody>
</table>
</div>
<div class="d-block d-lg-none">
<table aria-label="backups list" class="table table-hover responsive-table" id="backup_table_mini" width="100%" style="table-layout:fixed;">
<thead>
<tr class="rounded">
<th style="width: 20%; min-width: 64px;">{{ translate('serverBackups', 'enabled',
data['lang']) }}</th>
<th style="width: 40%; min-width: 10px;">Name
</th>
<th style="width: 40%; min-width: 50px;">{{ translate('serverBackups', 'edit', data['lang'])
}}</th>
</tr>
</thead>
<tbody>
{% for backup in data['backups'] %}
<tr>
<td id="{{backup.enabled}}" class="enabled">
<button type="button" class="btn btn-sm btn-info btn-toggle backup-custom-toggle" id="backup_{{backup.id}}" name="backup_{{backup.id}}" data-backup-id="{{backup.id}}" data-backup-enabled="{{ 'true' if backup.enabled else 'false' }}" data-toggle="button" aria-pressed="true" autocomplete="off">
<div class="handle"></div>
</button>
</td>
<td id="{{backup.backup_name}}" class="id">
<p>{{backup.backup_name}}</p>
</td>
<td id="backup_edit" class="action">
<button onclick="window.location.href=`/panel/backup_edit?id={{ data['server_stats']['server_id']['server_id'] }}&backup_id={{backup.id}}`" class="btn btn-info">
<i class="fas fa-pencil-alt"></i>
</button>
<button data-backup={{ backup.backup_id }} class="btn btn-danger del_button">
<i class="fas fa-trash" aria-hidden="true"></i>
</button>
<button data-backup={{ backup.backup_id }} data-toggle="tooltip" title="{{ translate('serverBackups', 'run', data['lang']) }}" class="btn btn-outline-warning test-socket">
<i class="fa-solid fa-vial"></i>
</button>
</td>
</tr>
{% end %}
</tbody>
</table>
</div>
{% end %}
</div>
</div>
</div>
</div>
<div class="row"> <div class="row">
<div class="col-md-6 col-sm-12"> <div class="col-md-6 col-sm-12">
<br> <br>
@ -173,7 +68,7 @@
class="text-muted ml-1"> - {{ translate('serverBackups', 'storageLocationDesc', data['lang']) class="text-muted ml-1"> - {{ translate('serverBackups', 'storageLocationDesc', data['lang'])
}}</small> </label> }}</small> </label>
<input type="text" class="form-control" name="backup_path" id="backup_path" <input type="text" class="form-control" name="backup_path" id="backup_path"
value="{{ data['backup_config']['backup_path'] }}" value="{{ data['backup_config']['backup_location'] }}"
placeholder="{{ translate('serverBackups', 'storageLocation', data['lang']) }}"> placeholder="{{ translate('serverBackups', 'storageLocation', data['lang']) }}">
{% end %} {% end %}
</div> </div>
@ -272,8 +167,10 @@
</div> </div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" id="modal-cancel" class="btn btn-secondary" data-dismiss="modal"><i class="fa-solid fa-xmark"></i></button> <button type="button" id="modal-cancel" class="btn btn-secondary" data-dismiss="modal"><i
<button type="button" id="modal-okay" data-dismiss="modal" class="btn btn-primary"><i class="fa-solid fa-thumbs-up"></i></button> class="fa-solid fa-xmark"></i></button>
<button type="button" id="modal-okay" data-dismiss="modal" class="btn btn-primary"><i
class="fa-solid fa-thumbs-up"></i></button>
</div> </div>
</div> </div>
</div> </div>
@ -309,7 +206,7 @@
</a> </a>
<br> <br>
<br> <br>
<button data-file="{{ backup['path'] }}" data-backup_path="{{ data['backup_path'] }}" <button data-file="{{ backup['path'] }}" data-backup_path="{{ data['backup_location'] }}"
class="btn btn-danger del_button"> class="btn btn-danger del_button">
<i class="fas fa-trash" aria-hidden="true"></i> <i class="fas fa-trash" aria-hidden="true"></i>
{{ translate('serverBackups', 'delete', data['lang']) }} {{ translate('serverBackups', 'delete', data['lang']) }}
@ -453,8 +350,10 @@
if (responseData.status === "ok") { if (responseData.status === "ok") {
window.location.reload(); window.location.reload();
} else { } else {
bootbox.alert({"title": responseData.status, bootbox.alert({
"message": responseData.error}) "title": responseData.status,
"message": responseData.error
})
} }
} }
@ -476,8 +375,10 @@
if (responseData.status === "ok") { if (responseData.status === "ok") {
window.location.href = "/panel/dashboard"; window.location.href = "/panel/dashboard";
} else { } else {
bootbox.alert({"title": responseData.status, bootbox.alert({
"message": responseData.error}) "title": responseData.status,
"message": responseData.error
})
} }
} }