Add informative confirm prompt for delete versions to avoid accidental clicks deleting versions and files.

This commit is contained in:
Roy Nieterau 2024-07-13 01:53:58 +02:00
parent 6786363aac
commit 0ddab6fbaa

View file

@ -1,6 +1,7 @@
import collections
import os
import uuid
from typing import Optional
import clique
import ayon_api
@ -41,6 +42,8 @@ class DeleteOldVersions(load.ProductLoaderPlugin):
)
]
requires_confirmation = True
def delete_whole_dir_paths(self, dir_paths, delete=True):
size = 0
@ -192,6 +195,32 @@ class DeleteOldVersions(load.ProductLoaderPlugin):
)
msgBox.exec_()
def confirm(self,
text: str,
informative_text: Optional[str] = None,
detailed_text: Optional[str] = None) -> bool:
"""Prompt user for a confirmation"""
messagebox = QtWidgets.QMessageBox()
messagebox.setWindowFlags(
messagebox.windowFlags() | QtCore.Qt.FramelessWindowHint
)
messagebox.setIcon(QtWidgets.QMessageBox.Warning)
messagebox.setWindowTitle("Delete Old Versions")
messagebox.setText(text)
if informative_text:
messagebox.setInformativeText(informative_text)
if detailed_text:
messagebox.setDetailedText(detailed_text)
messagebox.setStandardButtons(
QtWidgets.QMessageBox.Yes
| QtWidgets.QMessageBox.Cancel
)
messagebox.setDefaultButton(QtWidgets.QMessageBox.Cancel)
messagebox.setStyleSheet(style.load_stylesheet())
messagebox.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
return messagebox.exec_() == QtWidgets.QMessageBox.Yes
def get_data(self, context, versions_count):
product_entity = context["product"]
folder_entity = context["folder"]
@ -365,19 +394,40 @@ class DeleteOldVersions(load.ProductLoaderPlugin):
return size
def load(self, contexts, name=None, namespace=None, options=None):
# Get user options
versions_to_keep = 2
remove_publish_folder = False
if options:
versions_to_keep = options.get(
"versions_to_keep", versions_to_keep
)
remove_publish_folder = options.get(
"remove_publish_folder", remove_publish_folder
)
# Because we do not want this run by accident we will add an extra
# user confirmation
if self.requires_confirmation:
contexts_list = "\n".join(sorted(
"- {folder[name]} > {product[name]}".format_map(context)
for context in contexts
))
num_contexts = len(contexts)
s = "s" if num_contexts > 1 else ""
if not self.confirm(
"Are you sure you want to delete versions?\n\n"
f"This will keep only the last {versions_to_keep} "
f"versions for the {num_contexts} selected product{s}.",
informative_text="Warning: This will delete files from disk",
detailed_text=f"Keep only {versions_to_keep} versions for:\n"
f"{contexts_list}"
):
return
try:
size = 0
for count, context in enumerate(contexts):
versions_to_keep = 2
remove_publish_folder = False
if options:
versions_to_keep = options.get(
"versions_to_keep", versions_to_keep
)
remove_publish_folder = options.get(
"remove_publish_folder", remove_publish_folder
)
data = self.get_data(context, versions_to_keep)
if not data:
continue
@ -408,6 +458,8 @@ class CalculateOldVersions(DeleteOldVersions):
)
]
requires_confirmation = False
def main(self, project_name, data, remove_publish_folder):
size = 0