def dispatch( self, request, content_type_app_name, content_type_model_name, parent_page_id ): self.parent_page = get_object_or_404(Page, id=parent_page_id).specific self.parent_page_perms = self.parent_page.permissions_for_user( self.request.user ) if not self.parent_page_perms.can_add_subpage(): raise PermissionDenied try: self.page_content_type = ContentType.objects.get_by_natural_key( content_type_app_name, content_type_model_name ) except ContentType.DoesNotExist: raise Http404 # Get class self.page_class = self.page_content_type.model_class() # Make sure the class is a descendant of Page if not issubclass(self.page_class, Page): raise Http404 # page must be in the list of allowed subpage types for this parent ID if self.page_class not in self.parent_page.creatable_subpage_models(): raise PermissionDenied if not self.page_class.can_create_at(self.parent_page): raise PermissionDenied response = self.run_hook( "before_create_page", self.request, self.parent_page, self.page_class ) if response: return response self.locale = self.parent_page.locale # If the parent page is the root page. The user may specify any locale they like if self.parent_page.is_root(): selected_locale = request.GET.get("locale", None) or request.POST.get( "locale", None ) if selected_locale: self.locale = get_object_or_404(Locale, language_code=selected_locale) self.page = self.page_class(owner=self.request.user) self.page.locale = self.locale self.edit_handler = self.page_class.get_edit_handler() self.form_class = self.edit_handler.get_form_class() # Note: Comment notifications should be enabled by default for pages that a user creates self.subscription = PageSubscription( page=self.page, user=self.request.user, comment_notifications=True ) self.next_url = get_valid_next_url_from_request(self.request) return super().dispatch(request)
def dispatch(self, request, page_id): self.real_page_record = get_object_or_404(Page, id=page_id) self.latest_revision = self.real_page_record.get_latest_revision() self.page_content_type = self.real_page_record.cached_content_type self.page_class = self.real_page_record.specific_class if self.page_class is None: raise PageClassNotFoundError( f"The page '{self.real_page_record}' cannot be edited because the " f"model class used to create it ({self.page_content_type.app_label}." f"{self.page_content_type.model}) can no longer be found in the codebase. " "This usually happens as a result of switching between git " "branches without running migrations to trigger the removal of " "unused ContentTypes. To edit the page, you will need to switch " "back to a branch where the model class is still present.") self.page = self.real_page_record.get_latest_revision_as_page() self.parent = self.page.get_parent() self.page_perms = self.page.permissions_for_user(self.request.user) if not self.page_perms.can_edit(): raise PermissionDenied self.next_url = get_valid_next_url_from_request(self.request) response = self.run_hook("before_edit_page", self.request, self.page) if response: return response try: self.subscription = PageSubscription.objects.get( page=self.page, user=self.request.user) except PageSubscription.DoesNotExist: self.subscription = PageSubscription(page=self.page, user=self.request.user, comment_notifications=False) self.edit_handler = self.page_class.get_edit_handler() self.edit_handler = self.edit_handler.bind_to(instance=self.page, request=self.request) self.form_class = self.edit_handler.get_form_class() if getattr(settings, "WAGTAIL_WORKFLOW_ENABLED", True): # Retrieve current workflow state if set, default to last workflow state self.workflow_state = ( self.page.current_workflow_state or self.page.workflow_states.order_by("created_at").last()) else: self.workflow_state = None if self.workflow_state: self.workflow_tasks = self.workflow_state.all_tasks_with_status() else: self.workflow_tasks = [] self.errors_debug = None return super().dispatch(request)