def get_context_data(self, **kwargs): context = { "user_can_delete": self.permission_helper.user_can_delete_obj(self.request.user, self.instance) } context.update(kwargs) if self.model_admin.history_view_enabled: context["latest_log_entry"] = log_registry.get_logs_for_instance( self.instance).first() context["history_url"] = self.url_helper.get_action_url( "history", quote(self.instance.pk)) else: context["latest_log_entry"] = None context["history_url"] = None return super().get_context_data(**context)
def get_live_last_updated_info(self): # DraftStateMixin is applied but object is not live if self.draftstate_enabled and not self.object.live: return None revision = None # DraftStateMixin is applied and object is live if self.draftstate_enabled and self.object.live_revision: revision = self.object.live_revision # RevisionMixin is applied, so object is assumed to be live elif self.revision_enabled and self.object.latest_revision: revision = self.object.latest_revision # No mixin is applied or no revision exists, fall back to latest log entry if not revision: return log_registry.get_logs_for_instance(self.object).first() return { "timestamp": revision.created_at, "user_display_name": user_display_name(revision.user), }
def get_queryset(self): return log_registry.get_logs_for_instance( self.object).prefetch_related("user__wagtail_userprofile")
def edit(request, app_label, model_name, pk): model = get_snippet_model_from_url_params(app_label, model_name) permission = get_permission_name("change", model) if not request.user.has_perm(permission): raise PermissionDenied instance = get_object_or_404(model, pk=unquote(pk)) for fn in hooks.get_hooks("before_edit_snippet"): result = fn(request, instance) if hasattr(result, "status_code"): return result edit_handler = get_snippet_edit_handler(model) form_class = edit_handler.get_form_class() if request.method == "POST": form = form_class(request.POST, request.FILES, instance=instance, for_user=request.user) if form.is_valid(): with transaction.atomic(): form.save() log(instance=instance, action="wagtail.edit") messages.success( request, _("%(snippet_type)s '%(instance)s' updated.") % { "snippet_type": capfirst(model._meta.verbose_name), "instance": instance, }, buttons=[ messages.button( reverse( "wagtailsnippets:edit", args=(app_label, model_name, quote(instance.pk)), ), _("Edit"), ) ], ) for fn in hooks.get_hooks("after_edit_snippet"): result = fn(request, instance) if hasattr(result, "status_code"): return result return redirect("wagtailsnippets:list", app_label, model_name) else: messages.validation_error( request, _("The snippet could not be saved due to errors."), form) else: form = form_class(instance=instance, for_user=request.user) edit_handler = edit_handler.get_bound_panel(instance=instance, request=request, form=form) latest_log_entry = log_registry.get_logs_for_instance(instance).first() action_menu = SnippetActionMenu(request, view="edit", instance=instance) context = { "model_opts": model._meta, "instance": instance, "edit_handler": edit_handler, "form": form, "action_menu": action_menu, "locale": None, "translations": [], "latest_log_entry": latest_log_entry, "media": edit_handler.media + form.media + action_menu.media, } if getattr(settings, "WAGTAIL_I18N_ENABLED", False) and issubclass( model, TranslatableMixin): context.update({ "locale": instance.locale, "translations": [{ "locale": translation.locale, "url": reverse( "wagtailsnippets:edit", args=[app_label, model_name, quote(translation.pk)], ), } for translation in instance.get_translations().select_related( "locale")], }) return TemplateResponse(request, "wagtailsnippets/snippets/edit.html", context)
def get_queryset(self): return log_registry.get_logs_for_instance(self.object).select_related( "revision", "user", "user__wagtail_userprofile")
def _get_latest_log_entry(self): return log_registry.get_logs_for_instance(self.object).first()