diff --git a/aleksis/core/data_checks.py b/aleksis/core/data_checks.py index 1279822f8d1f28bb40e040d9eaf0bb8126540940..2e95620933b74cc6fd89e94570686dd43bf7119d 100644 --- a/aleksis/core/data_checks.py +++ b/aleksis/core/data_checks.py @@ -255,3 +255,35 @@ def send_emails_for_data_checks(): logging.info("Sent notification email because of unsent data checks") results.update(sent=True) + + +class DeactivateDashboardWidgetSolveOption(SolveOption): + name = "deactivate_dashboard_widget" + verbose_name = _("Deactivate DashboardWidget") + + @classmethod + def solve(cls, check_result: "DataCheckResult"): + widget = check_result.related_object + widget.active = False + widget.save() + check_result.delete() + + +class BrokenDashboardWidgetDataCheck(DataCheck): + name = "broken_dashboard_widgets" + verbose_name = _("Ensure that there are no broken DashboardWidgets.") + problem_name = _("The DashboardWidget was reported broken automatically.") + solve_options = { + IgnoreSolveOption.name: IgnoreSolveOption, + DeactivateDashboardWidgetSolveOption.name: DeactivateDashboardWidgetSolveOption, + } + + @classmethod + def check_data(cls): + from .models import DashboardWidget + + broken_widgets = DashboardWidget.objects.filter(broken=True, active=True) + + for widget in broken_widgets: + logging.info(f"Check DashboardWidget {widget}") + cls.register_result(widget) diff --git a/aleksis/core/models.py b/aleksis/core/models.py index 04bc77b7a6f3e89a345bd2e54f60e0842bfed296..d6c79b74d88b775c16a2d47f5e577f7ee74753d9 100644 --- a/aleksis/core/models.py +++ b/aleksis/core/models.py @@ -26,7 +26,7 @@ from model_utils.models import TimeStampedModel from phonenumber_field.modelfields import PhoneNumberField from polymorphic.models import PolymorphicModel -from aleksis.core.data_checks import DataCheck, DataCheckRegistry +from aleksis.core.data_checks import BrokenDashboardWidgetDataCheck, DataCheck, DataCheckRegistry from .managers import ( CurrentSiteManagerWithoutMigrations, @@ -689,6 +689,8 @@ class DashboardWidget(PolymorphicModel, PureDjangoModel): ) """ + data_checks = [BrokenDashboardWidgetDataCheck] + @staticmethod def get_media(widgets: Union[QuerySet, Iterable]): """Return all media required to render the selected widgets."""