diff --git a/AKModel/admin.py b/AKModel/admin.py index 1bc4a653734aae3af4457ebe74b1f1ef8cc3e0ad..b26c9d6353ae7727fc56aba85d33878065ea992e 100644 --- a/AKModel/admin.py +++ b/AKModel/admin.py @@ -349,7 +349,7 @@ class ConstraintViolationAdminForm(forms.ModelForm): @admin.register(ConstraintViolation) class ConstraintViolationAdmin(admin.ModelAdmin): - list_display = ['type', 'level', 'get_details'] + list_display = ['type', 'level', 'get_details', 'manually_resolved'] list_filter = ['event'] readonly_fields = ['timestamp'] form = ConstraintViolationAdminForm diff --git a/AKModel/views.py b/AKModel/views.py index a766d896e37153ab7e5d5d340b01e61b33304a1c..ea9435af92663e0ae05da2ff6afd3baa63a61aa7 100644 --- a/AKModel/views.py +++ b/AKModel/views.py @@ -376,6 +376,7 @@ class ExportSlidesView(EventSlugMixin, IntermediateAdminView): class IntermediateAdminActionView(IntermediateAdminView, ABC): form_class = AdminIntermediateActionForm + entities = None def get_queryset(self, pks=None): if pks is None: @@ -388,34 +389,51 @@ class IntermediateAdminActionView(IntermediateAdminView, ABC): return initial def get_preview(self): - entities = self.get_queryset() - joined_entities = '\n'.join(str(e) for e in entities) + self.entities = self.get_queryset() + joined_entities = '\n'.join(str(e) for e in self.entities) return f"{self.confirmation_message}:\n\n {joined_entities}" def get_success_url(self): return reverse(f"admin:{self.model._meta.app_label}_{self.model._meta.model_name}_changelist") @abstractmethod - def perform_action(self, entity): + def action(self, form): pass def form_valid(self, form): - entities = self.get_queryset(pks=form.cleaned_data['pks']) - for entity in entities: - self.perform_action(entity) - entity.save() + self.entities = self.get_queryset(pks=form.cleaned_data['pks']) + self.action(form) messages.add_message(self.request, messages.SUCCESS, self.success_message) return super().form_valid(form) +class LoopActionMixin(ABC): + def action(self, form): + self.pre_action() + for entity in self.entities: + self.perform_action(entity) + entity.save() + self.post_action() + + @abstractmethod + def perform_action(self, entity): + pass + + def pre_action(self): + pass + + def post_action(self): + pass + + class CVMarkResolvedView(IntermediateAdminActionView): title = _('Mark Constraint Violations as manually resolved') model = ConstraintViolation confirmation_message = _("The following Constraint Violations will be marked as manually resolved") success_message = _("Constraint Violations marked as resolved") - def perform_action(self, entity): - entity.manually_resolved = True + def action(self, form): + self.entities.update(manually_resolved=True) class CVSetLevelViolationView(IntermediateAdminActionView): @@ -424,8 +442,8 @@ class CVSetLevelViolationView(IntermediateAdminActionView): confirmation_message = _("The following Constraint Violations will be set to level 'violation'") success_message = _("Constraint Violations set to level 'violation'") - def perform_action(self, entity): - entity.level = ConstraintViolation.ViolationLevel.VIOLATION + def action(self, form): + self.entities.update(level=ConstraintViolation.ViolationLevel.VIOLATION) class CVSetLevelWarningView(IntermediateAdminActionView): @@ -434,8 +452,8 @@ class CVSetLevelWarningView(IntermediateAdminActionView): confirmation_message = _("The following Constraint Violations will be set to level 'warning'") success_message = _("Constraint Violations set to level 'warning'") - def perform_action(self, entity): - entity.level = ConstraintViolation.ViolationLevel.WARNING + def action(self, form): + self.entities.update(level=ConstraintViolation.ViolationLevel.WARNING) class AKResetInterestView(IntermediateAdminActionView): @@ -444,8 +462,8 @@ class AKResetInterestView(IntermediateAdminActionView): confirmation_message = _("Interest of the following AKs will be set to not filled (-1):") success_message = _("Reset of interest in AKs successful.") - def perform_action(self, entity): - entity.interest = -1 + def action(self, form): + self.entities.update(interest=-1) class AKResetInterestCounterView(IntermediateAdminActionView): @@ -454,5 +472,5 @@ class AKResetInterestCounterView(IntermediateAdminActionView): confirmation_message = _("Interest counter of the following AKs will be set to 0:") success_message = _("AKs' interest counters set back to 0.") - def perform_action(self, entity): - entity.interest_counter = 0 + def action(self, form): + self.entities.update(interest_counter=0)