From 09219dcf15b02712510e984f1a46a0632d7416c6 Mon Sep 17 00:00:00 2001 From: Brian Canini <canini.16@osu.edu> Date: Wed, 5 Aug 2020 15:02:36 -0400 Subject: [PATCH] Updating drupal/view_unpublished (1.0.0-rc2 => 1.0.0-rc3) --- composer.json | 2 +- composer.lock | 16 ++-- vendor/composer/installed.json | 16 ++-- .../src/Plugin/views/filter/NodeStatus.php | 3 - .../src/ViewUnpublishedInstallHelper.php | 80 +++++++++++++++++++ .../Functional/ViewUnpublishedViewsTest.php | 4 +- .../Kernel/ViewUnpublishedDependencyTest.php | 69 ++++++++++++++++ .../view_unpublished.info.yml | 6 +- .../view_unpublished/view_unpublished.install | 24 +++--- .../view_unpublished.permissions.yml | 2 +- .../view_unpublished.services.yml | 7 ++ .../view_unpublished.views.inc | 10 ++- .../view_unpublished.views_execution.inc | 3 - 13 files changed, 196 insertions(+), 46 deletions(-) create mode 100644 web/modules/view_unpublished/src/ViewUnpublishedInstallHelper.php create mode 100644 web/modules/view_unpublished/tests/src/Kernel/ViewUnpublishedDependencyTest.php create mode 100644 web/modules/view_unpublished/view_unpublished.services.yml diff --git a/composer.json b/composer.json index 17ddc02d50..041f5b0aee 100644 --- a/composer.json +++ b/composer.json @@ -173,7 +173,7 @@ "drupal/twitter_block": "3.0-alpha0", "drupal/userprotect": "1.1", "drupal/video_embed_field": "2.4", - "drupal/view_unpublished": "1.0-rc2", + "drupal/view_unpublished": "1.0-rc3", "drupal/views_accordion": "1.1", "drupal/views_ajax_history": "1.5", "drupal/views_autocomplete_filters": "1.3", diff --git a/composer.lock b/composer.lock index d6670ccd50..ccccdc6c61 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "8f3515004e0cf833c3fe5d3ee771f2bb", + "content-hash": "39b9746c20709cbd7601baab7dd38d74", "packages": [ { "name": "alchemy/zippy", @@ -7934,17 +7934,17 @@ }, { "name": "drupal/view_unpublished", - "version": "1.0.0-rc2", + "version": "1.0.0-rc3", "source": { "type": "git", "url": "https://git.drupalcode.org/project/view_unpublished.git", - "reference": "8.x-1.0-rc2" + "reference": "8.x-1.0-rc3" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/view_unpublished-8.x-1.0-rc2.zip", - "reference": "8.x-1.0-rc2", - "shasum": "673b2a76176b68b5f27affd4c2a718c2eaa45764" + "url": "https://ftp.drupal.org/files/projects/view_unpublished-8.x-1.0-rc3.zip", + "reference": "8.x-1.0-rc3", + "shasum": "6973708d48b76531fa9227d8b959a516e1cb9129" }, "require": { "drupal/core": "^8 || ^9" @@ -7952,8 +7952,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "8.x-1.0-rc2", - "datestamp": "1593633641", + "version": "8.x-1.0-rc3", + "datestamp": "1595646359", "security-coverage": { "status": "not-covered", "message": "RC releases are not covered by Drupal security advisories." diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 6496457e56..6f1380af51 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -8180,18 +8180,18 @@ }, { "name": "drupal/view_unpublished", - "version": "1.0.0-rc2", - "version_normalized": "1.0.0.0-RC2", + "version": "1.0.0-rc3", + "version_normalized": "1.0.0.0-RC3", "source": { "type": "git", "url": "https://git.drupalcode.org/project/view_unpublished.git", - "reference": "8.x-1.0-rc2" + "reference": "8.x-1.0-rc3" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/view_unpublished-8.x-1.0-rc2.zip", - "reference": "8.x-1.0-rc2", - "shasum": "673b2a76176b68b5f27affd4c2a718c2eaa45764" + "url": "https://ftp.drupal.org/files/projects/view_unpublished-8.x-1.0-rc3.zip", + "reference": "8.x-1.0-rc3", + "shasum": "6973708d48b76531fa9227d8b959a516e1cb9129" }, "require": { "drupal/core": "^8 || ^9" @@ -8199,8 +8199,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "8.x-1.0-rc2", - "datestamp": "1593633641", + "version": "8.x-1.0-rc3", + "datestamp": "1595646359", "security-coverage": { "status": "not-covered", "message": "RC releases are not covered by Drupal security advisories." diff --git a/web/modules/view_unpublished/src/Plugin/views/filter/NodeStatus.php b/web/modules/view_unpublished/src/Plugin/views/filter/NodeStatus.php index 8fe9c814ee..073732894c 100644 --- a/web/modules/view_unpublished/src/Plugin/views/filter/NodeStatus.php +++ b/web/modules/view_unpublished/src/Plugin/views/filter/NodeStatus.php @@ -4,7 +4,6 @@ use Drupal\node\Entity\NodeType; use Drupal\node\Plugin\views\filter\Status; -use Drupal\views\Annotation\ViewsFilter; /** * Filter by view all unpublished permissions granted by view_unpublished. @@ -12,8 +11,6 @@ * Takes over the Published or Admin filter query. * * @ingroup views_filter_handlers - * - * @ViewsFilter("view_unpublished_node_status") */ class NodeStatus extends Status { diff --git a/web/modules/view_unpublished/src/ViewUnpublishedInstallHelper.php b/web/modules/view_unpublished/src/ViewUnpublishedInstallHelper.php new file mode 100644 index 0000000000..de63ec48c5 --- /dev/null +++ b/web/modules/view_unpublished/src/ViewUnpublishedInstallHelper.php @@ -0,0 +1,80 @@ +<?php + +namespace Drupal\view_unpublished; + +use Drupal\Core\Config\CachedStorage; +use Drupal\Core\Config\ConfigFactoryInterface; +use Drupal\Core\Entity\EntityTypeManagerInterface; + +/** + * Class ViewUnpublishedInstallHelper. + */ +class ViewUnpublishedInstallHelper { + + /** + * Drupal\Core\Config\ConfigFactoryInterface definition. + * + * @var \Drupal\Core\Config\ConfigFactoryInterface + */ + protected $configFactory; + + /** + * Drupal\Core\Config\CachedStorage definition. + * + * @var \Drupal\Core\Config\CachedStorage + */ + protected $configStorage; + + /** + * Drupal\Core\Entity\EntityTypeManagerInterface definition. + * + * @var \Drupal\Core\Entity\EntityTypeManagerInterface + */ + protected $entityTypeManager; + + /** + * Constructs a new ViewUnpublishedInstallHelper object. + * + * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager + * The entity type manager service. + * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory + * The config factory service. + * @param \Drupal\Core\Config\CachedStorage $config_storage + * The config storage service. + */ + public function __construct(EntityTypeManagerInterface $entity_type_manager, ConfigFactoryInterface $config_factory, CachedStorage $config_storage) { + $this->entityTypeManager = $entity_type_manager; + $this->configFactory = $config_factory; + $this->configStorage = $config_storage; + } + + /** + * Helper that flags node_access to be rebuilt if unpublished nodes exist. + */ + public function flagRebuild() { + $query = $this->entityTypeManager->getStorage('node')->getQuery(); + $count_unpublished = (int) $query->condition('status', FALSE)->count()->execute(); + if ($count_unpublished > 0) { + node_access_needs_rebuild(TRUE); + } + } + + /** + * Remove the errant view_unpublished dependency from Views. + */ + public function removeDependency() { + + $view_names = $this->configStorage->listAll('views.view'); + foreach ($view_names as $name) { + $dependencies = $this->configFactory->get($name)->get('dependencies.module'); + if (!empty($dependencies) && array_key_exists('view_unpublished', array_flip($dependencies))) { + $dependencies = array_diff($dependencies, ['view_unpublished']); + $this->configFactory + ->getEditable($name) + ->set('dependencies.module', $dependencies) + ->save(TRUE); + } + } + } + +} diff --git a/web/modules/view_unpublished/tests/src/Functional/ViewUnpublishedViewsTest.php b/web/modules/view_unpublished/tests/src/Functional/ViewUnpublishedViewsTest.php index 6f553f9dca..f44640dc25 100644 --- a/web/modules/view_unpublished/tests/src/Functional/ViewUnpublishedViewsTest.php +++ b/web/modules/view_unpublished/tests/src/Functional/ViewUnpublishedViewsTest.php @@ -46,10 +46,10 @@ protected function setUp() { */ public function testIt() { $page_node = $this->createNode(['type' => 'page']); - $page_node->setPublished(FALSE); + $page_node->setUnPublished(); $page_node->save(); $article_node = $this->createNode(['type' => 'article']); - $article_node->setPublished(FALSE); + $article_node->setUnPublished(); $article_node->save(); $this->drupalLogin($this->createUser(['view any unpublished content', 'access content overview'])); diff --git a/web/modules/view_unpublished/tests/src/Kernel/ViewUnpublishedDependencyTest.php b/web/modules/view_unpublished/tests/src/Kernel/ViewUnpublishedDependencyTest.php new file mode 100644 index 0000000000..b43938a722 --- /dev/null +++ b/web/modules/view_unpublished/tests/src/Kernel/ViewUnpublishedDependencyTest.php @@ -0,0 +1,69 @@ +<?php + +namespace Drupal\Tests\view_unpublished\Kernel; + +use Drupal\KernelTests\KernelTestBase; +use Drupal\views\Views; + +/** + * Tests the View Unpublished dependency issue. + * + * @group view_unpublished + */ +class ViewUnpublishedDependencyTest extends KernelTestBase { + + /** + * Modules to enable. + * + * @var array + */ + public static $modules = [ + 'field', + 'node', + 'system', + 'text', + 'user', + 'view_unpublished', + 'views', + ]; + + /** + * {@inheritdoc} + */ + protected function setUp() { + parent::setUp(); + + $this->installEntitySchema('user'); + $this->installEntitySchema('node'); + $this->installConfig('node'); + } + + /** + * Tests view_unpublished not added as dependency of content view. + */ + public function testDependencyNotAdded() { + // Check dependency before saving. + $module_deps = $this->config('views.view.content')->get('dependencies.module'); + $this->assertArrayNotHasKey('view_unpublished', array_flip($module_deps)); + + // Save and check again. + $view = Views::getView('content'); + $view->save(); + $module_deps = $this->config('views.view.content')->get('dependencies.module'); + $this->assertArrayNotHasKey('view_unpublished', array_flip($module_deps)); + } + + /** + * Tests the remove dependency install helper. + */ + public function testDependencyRemoved() { + $module_deps = $this->config('views.view.content')->get('dependencies.module'); + $module_deps[] = 'view_unpublished'; + $this->config('views.view.content')->set('dependencies.module', $module_deps)->save(TRUE); + $this->container->get('view_unpublished.install_helper')->removeDependency(); + $module_deps = $this->config('views.view.content')->get('dependencies.module'); + $this->assertNotEmpty($module_deps); + $this->assertArrayNotHasKey('view_unpublished', array_flip($module_deps)); + } + +} diff --git a/web/modules/view_unpublished/view_unpublished.info.yml b/web/modules/view_unpublished/view_unpublished.info.yml index 1030f2667b..ce33c2b77c 100644 --- a/web/modules/view_unpublished/view_unpublished.info.yml +++ b/web/modules/view_unpublished/view_unpublished.info.yml @@ -7,7 +7,7 @@ type: module dependencies: - drupal:node -# Information added by Drupal.org packaging script on 2020-07-01 -version: '8.x-1.0-rc2' +# Information added by Drupal.org packaging script on 2020-07-25 +version: '8.x-1.0-rc3' project: 'view_unpublished' -datestamp: 1593633642 +datestamp: 1595646337 diff --git a/web/modules/view_unpublished/view_unpublished.install b/web/modules/view_unpublished/view_unpublished.install index d8cc7b703f..2792f8d2ba 100644 --- a/web/modules/view_unpublished/view_unpublished.install +++ b/web/modules/view_unpublished/view_unpublished.install @@ -11,25 +11,16 @@ * Implements hook_install(). */ function view_unpublished_install() { - _view_unpublished_flag_rebuild_if_needed(); + Drupal::service('view_unpublished.install_helper')->flagRebuild(); } /** * Implements hook_uninstall(). */ function view_unpublished_uninstall() { - _view_unpublished_flag_rebuild_if_needed(); -} - -/** - * Helper that flags node_access to be rebuilt if unpublished nodes exist. - */ -function _view_unpublished_flag_rebuild_if_needed() { - $query = \Drupal::entityTypeManager()->getStorage('node')->getQuery(); - $count_unpublished = (int) $query->condition('status', FALSE)->count()->execute(); - if ($count_unpublished > 0) { - node_access_needs_rebuild(TRUE); - } + Drupal::service('view_unpublished.install_helper')->flagRebuild(); + // Remove any errant view_unpublished dependency. + Drupal::service('view_unpublished.install_helper')->removeDependency(); } /** @@ -45,3 +36,10 @@ function view_unpublished_update_8001() { [':rebuild' => Url::fromRoute('node.configure_rebuild_confirm')->toString()] ); } + +/** + * Remove any view_unpublished dependency that may have been added to views. + */ +function view_unpublished_update_8002() { + Drupal::service('view_unpublished.install_helper')->removeDependency(); +} diff --git a/web/modules/view_unpublished/view_unpublished.permissions.yml b/web/modules/view_unpublished/view_unpublished.permissions.yml index 34690838f9..f671132d0f 100644 --- a/web/modules/view_unpublished/view_unpublished.permissions.yml +++ b/web/modules/view_unpublished/view_unpublished.permissions.yml @@ -2,4 +2,4 @@ view any unpublished content: title: 'View any unpublished content' permission_callbacks: - - Drupal\view_unpublished\ViewUnpublishedPermissions::permissions \ No newline at end of file + - Drupal\view_unpublished\ViewUnpublishedPermissions::permissions diff --git a/web/modules/view_unpublished/view_unpublished.services.yml b/web/modules/view_unpublished/view_unpublished.services.yml new file mode 100644 index 0000000000..b1f20653ad --- /dev/null +++ b/web/modules/view_unpublished/view_unpublished.services.yml @@ -0,0 +1,7 @@ +services: + logger.channel.view_unpublished: + parent: logger.channel_base + arguments: ['view_unpublished'] + view_unpublished.install_helper: + class: Drupal\view_unpublished\ViewUnpublishedInstallHelper + arguments: ['@entity_type.manager', '@config.factory', '@config.storage'] diff --git a/web/modules/view_unpublished/view_unpublished.views.inc b/web/modules/view_unpublished/view_unpublished.views.inc index b8714d0719..0edfad6397 100644 --- a/web/modules/view_unpublished/view_unpublished.views.inc +++ b/web/modules/view_unpublished/view_unpublished.views.inc @@ -5,10 +5,12 @@ * Provide views data for view_unpublished.module. */ +use Drupal\view_unpublished\Plugin\views\filter\NodeStatus; + /** - * Implements hook_views_data_alter(). + * Implements hook_views_plugins_filter_alter(). */ -function view_unpublished_views_data_alter(array &$data) { - // The published status + extra handler is taken over by our handler. - $data['node_field_data']['status_extra']['filter']['id'] = 'view_unpublished_node_status'; +function view_unpublished_views_plugins_filter_alter(array &$plugins) { + // Change the 'status' handler class. + $plugins['node_status']['class'] = NodeStatus::class; } diff --git a/web/modules/view_unpublished/view_unpublished.views_execution.inc b/web/modules/view_unpublished/view_unpublished.views_execution.inc index 9df92816b8..0ee308ce32 100644 --- a/web/modules/view_unpublished/view_unpublished.views_execution.inc +++ b/web/modules/view_unpublished/view_unpublished.views_execution.inc @@ -12,9 +12,6 @@ * Implements hook_views_query_substitutions(). */ function view_unpublished_views_query_substitutions(ViewExecutable $view) { - if ($view->id() != 'content' && !empty($view->filter['status']->value) && $view->filter['status']->value == 1) { - return; - } $account = \Drupal::currentUser(); $substitutions = []; foreach (NodeType::loadMultiple() as $type) { -- GitLab