from functools import wraps from PyQt6.QtWidgets import QMessageBox from app.core.main_manager import MainManager def require_license(feature_id: str, show_upgrade_dialog: bool = True): """ Décorateur pour protéger une fonctionnalité premium Usage: @require_license("advanced_export") def export_to_excel(self): # Code de la fonctionnalité premium """ def decorator(func): @wraps(func) def wrapper(*args, **kwargs): main_manager = MainManager.get_instance() license_manager = main_manager.get_license_manager() settings_manager = main_manager.get_settings_manager() # Si le système de licence est désactivé, autoriser toutes les fonctionnalités if not settings_manager.get_config("enable_licensing"): return func(*args, **kwargs) if not license_manager.is_feature_available(feature_id): if show_upgrade_dialog: show_upgrade_message(feature_id) return None return func(*args, **kwargs) return wrapper return decorator def show_upgrade_message(feature_id: str): """Affiche un message invitant à acheter la version premium""" main_manager = MainManager.get_instance() language_manager = main_manager.get_language_manager() settings_manager = main_manager.get_settings_manager() # Si le système de licence est désactivé, ne rien afficher if not settings_manager.get_config("enable_licensing"): return feature_name = settings_manager.get_config("feature_descriptions", {}).get( feature_id, feature_id ) msg = QMessageBox() msg.setIcon(QMessageBox.Icon.Information) msg.setWindowTitle(language_manager.get_text("premium_feature")) msg.setText(language_manager.get_text("premium_feature_message").format(feature=feature_name)) msg.setInformativeText(language_manager.get_text("upgrade_prompt")) buy_btn = msg.addButton(language_manager.get_text("buy_now"), QMessageBox.ButtonRole.AcceptRole) activate_btn = msg.addButton(language_manager.get_text("activate_license"), QMessageBox.ButtonRole.ActionRole) msg.addButton(language_manager.get_text("cancel"), QMessageBox.ButtonRole.RejectRole) msg.exec() if msg.clickedButton() == buy_btn: import webbrowser webbrowser.open(settings_manager.get_config("purchase_url")) elif msg.clickedButton() == activate_btn: from app.ui.windows.activation_window import ActivationWindow activation_window = ActivationWindow() activation_window.exec()