From 4cfd10fd8c1b2bcbd4fae07c5a422c183b72961e Mon Sep 17 00:00:00 2001 From: Eric Bremner Date: Thu, 15 Sep 2022 14:33:38 -0400 Subject: [PATCH 01/13] ISTWCMS-5753: adding CSV content report --- src/Controller/UwDownloadCsvController.php | 121 +++++++++++++++++++++ uw_cfg_common.routing.yml | 8 ++ 2 files changed, 129 insertions(+) create mode 100644 src/Controller/UwDownloadCsvController.php diff --git a/src/Controller/UwDownloadCsvController.php b/src/Controller/UwDownloadCsvController.php new file mode 100644 index 0000000..8cb5a23 --- /dev/null +++ b/src/Controller/UwDownloadCsvController.php @@ -0,0 +1,121 @@ +entityTypeManager = $entityTypeManager; + $this->pathAlias = $pathAlias; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + return new static( + $container->get('entity_type.manager'), + $container->get('path_alias.manager') + ); + } + + /** + * Provides a CSV file for content on a site. + * + * @return Response + * The page response. + * + * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException + * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException + */ + public function uwContentReport() { + + // Get all the nodes. + $nodes = $this->entityTypeManager->getStorage('node')->loadMultiple(); + + // Just in case there are no nodes, there should always + // be a home page though, this is just to ensure no errors. + $response = NULL; + + if ($nodes) { + + // The header of the CSV. + $data = [ + $this->t('Node ID'), + $this->t('Title'), + $this->t('Content type'), + $this->t('Path'), + $this->t('Published'), + $this->t('Created'), + $this->t('Last updated'), + ]; + + // Put header for CSV into format to be used in CSV. + $rows[] = implode(',', $data); + + // Step through each of the nodes and get the info. + foreach ($nodes as $node) { + + // Pull out the info about the node. + $data = [ + 'nid' => $node->id(), + 'title' => '"' . $node->getTitle() . '"', + 'type' => $node->type->entity->label(), + 'path' => $this->pathAlias->getAliasByPath('/node/' . $node->id()), + 'published' => $node->status->value, + 'created' => date('Y-d-m G:i', $node->getCreatedTime()), + 'updated' => date('Y-d-m G:i', $node->getChangedTime()), + ]; + + // Store the node info for use later in the CSV. + $rows[] = implode(',', $data); + } + + // Put the info into a large CSV format. + $content = implode("\n", $rows); + + // Create the response for the CSV page. + $response = new Response($content); + + // Set the headers for the CSV. + $response->headers->set('Content-Type', 'text/csv'); + $response->headers->set('Content-Disposition', 'attachment; filename="content_report.csv"'); + } + + return $response; + } + +} diff --git a/uw_cfg_common.routing.yml b/uw_cfg_common.routing.yml index 28c3b4c..ebab606 100644 --- a/uw_cfg_common.routing.yml +++ b/uw_cfg_common.routing.yml @@ -34,3 +34,11 @@ uw_cfg_common.content_type_usage_page: _title: 'Content type Use' requirements: _permission: 'access content' +uw_cfg_common.uw_content_report_csv: + path: '/admin/reports/uw_content_report_csv' + defaults: + _title: 'Download Customers' + _controller: \Drupal\uw_cfg_common\Controller\UwDownloadCsvController::uwContentReport + requirements: + _permission: 'access content' + -- GitLab From 467fc94d1cfd63750f7b446e8651eb75f238f164 Mon Sep 17 00:00:00 2001 From: Eric Bremner Date: Thu, 15 Sep 2022 14:46:15 -0400 Subject: [PATCH 02/13] ISTWCMS-5753: adding correct permissions for csv content report --- src/UwRoles/user.role.uw_role_site_manager.yml | 1 + uw_cfg_common.permissions.yml | 3 +++ uw_cfg_common.routing.yml | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/UwRoles/user.role.uw_role_site_manager.yml b/src/UwRoles/user.role.uw_role_site_manager.yml index 3a0a1a8..642e2e0 100644 --- a/src/UwRoles/user.role.uw_role_site_manager.yml +++ b/src/UwRoles/user.role.uw_role_site_manager.yml @@ -178,3 +178,4 @@ permissions: - 'view own unpublished media' - 'view scheduled content' - 'view unpublished paragraphs' + - 'view UW CSV reports' diff --git a/uw_cfg_common.permissions.yml b/uw_cfg_common.permissions.yml index f9097d5..dd2f511 100644 --- a/uw_cfg_common.permissions.yml +++ b/uw_cfg_common.permissions.yml @@ -21,3 +21,6 @@ 'rearrange profiles': title: 'Rearrange profiles' description: 'Allows access to the rearrange profiles page.' +'view UW CSV reports': + title: 'View UW CSV reports' + description: 'Allows access to UW CSV reports.' diff --git a/uw_cfg_common.routing.yml b/uw_cfg_common.routing.yml index ebab606..575d72b 100644 --- a/uw_cfg_common.routing.yml +++ b/uw_cfg_common.routing.yml @@ -40,5 +40,5 @@ uw_cfg_common.uw_content_report_csv: _title: 'Download Customers' _controller: \Drupal\uw_cfg_common\Controller\UwDownloadCsvController::uwContentReport requirements: - _permission: 'access content' + _permission: 'view UW CSV reports' -- GitLab From 973cc0f3c391c94becc0a24d4e3f02901d4f9eab Mon Sep 17 00:00:00 2001 From: Eric Bremner Date: Thu, 15 Sep 2022 14:51:04 -0400 Subject: [PATCH 03/13] ISTWCMS-5753: fixing permission from site manager to site owner for csv reports --- src/UwRoles/user.role.uw_role_site_manager.yml | 1 - src/UwRoles/user.role.uw_role_site_owner.yml | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/UwRoles/user.role.uw_role_site_manager.yml b/src/UwRoles/user.role.uw_role_site_manager.yml index 642e2e0..3a0a1a8 100644 --- a/src/UwRoles/user.role.uw_role_site_manager.yml +++ b/src/UwRoles/user.role.uw_role_site_manager.yml @@ -178,4 +178,3 @@ permissions: - 'view own unpublished media' - 'view scheduled content' - 'view unpublished paragraphs' - - 'view UW CSV reports' diff --git a/src/UwRoles/user.role.uw_role_site_owner.yml b/src/UwRoles/user.role.uw_role_site_owner.yml index ee49d4a..2371c6f 100644 --- a/src/UwRoles/user.role.uw_role_site_owner.yml +++ b/src/UwRoles/user.role.uw_role_site_owner.yml @@ -49,3 +49,4 @@ permissions: - 'customize shortcut links' - 'edit users role expire' - 'enable disable ofis profiles' + - 'view UW CSV reports' -- GitLab From 57032c5826697c28a566df38186797c9bfd495f4 Mon Sep 17 00:00:00 2001 From: Eric Bremner Date: Thu, 15 Sep 2022 14:51:34 -0400 Subject: [PATCH 04/13] ISTWCMS-5753: adding content report csv to site management menu --- uw_cfg_common.links.menu.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/uw_cfg_common.links.menu.yml b/uw_cfg_common.links.menu.yml index 259c7b0..a57a10d 100644 --- a/uw_cfg_common.links.menu.yml +++ b/uw_cfg_common.links.menu.yml @@ -389,3 +389,8 @@ uw_site_management.wcms_how_to_documents: menu_name: uw-menu-site-management url: https://uwaterloo.ca/web-resources/wcms-users/training-and-support/wcms-how-documents weight: 0 +uw_site_management.uw_content_report_csv: + title: 'Content report (CSV)' + menu_name: uw-menu-site-management + route_name: uw_cfg_common.uw_content_report_csv + weight: 0 -- GitLab From c0b68d2373bff44d358aae2d2278a15a582777ae Mon Sep 17 00:00:00 2001 From: Eric Bremner Date: Thu, 15 Sep 2022 15:02:15 -0400 Subject: [PATCH 05/13] ISTWCMS-5753: fixing title of page for content csv report --- uw_cfg_common.routing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uw_cfg_common.routing.yml b/uw_cfg_common.routing.yml index 575d72b..946c06d 100644 --- a/uw_cfg_common.routing.yml +++ b/uw_cfg_common.routing.yml @@ -37,7 +37,7 @@ uw_cfg_common.content_type_usage_page: uw_cfg_common.uw_content_report_csv: path: '/admin/reports/uw_content_report_csv' defaults: - _title: 'Download Customers' + _title: 'Download UW Content Report (CSV)' _controller: \Drupal\uw_cfg_common\Controller\UwDownloadCsvController::uwContentReport requirements: _permission: 'view UW CSV reports' -- GitLab From 63dc3fae3e200897762a7e90bf130bde2d28b9f6 Mon Sep 17 00:00:00 2001 From: Eric Bremner Date: Fri, 16 Sep 2022 10:11:05 -0400 Subject: [PATCH 06/13] ISTWCMS-5753: coding standards --- src/Controller/UwDownloadCsvController.php | 7 ++++--- uw_cfg_common.routing.yml | 1 - 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Controller/UwDownloadCsvController.php b/src/Controller/UwDownloadCsvController.php index 8cb5a23..f10ae63 100644 --- a/src/Controller/UwDownloadCsvController.php +++ b/src/Controller/UwDownloadCsvController.php @@ -11,7 +11,7 @@ use Symfony\Component\HttpFoundation\Response; /** * Provides CSV files for specific UW sites. */ -class UwDownloadCsvController extends ControllerBase{ +class UwDownloadCsvController extends ControllerBase { /** * Entity type manager from the core. @@ -21,8 +21,9 @@ class UwDownloadCsvController extends ControllerBase{ protected $entityTypeManager; /** + * The path alias. + * * @var \Drupal\path_alias\AliasManager - * The path alias. */ protected $pathAlias; @@ -55,7 +56,7 @@ class UwDownloadCsvController extends ControllerBase{ /** * Provides a CSV file for content on a site. * - * @return Response + * @return Symfony\Component\HttpFoundation\Response * The page response. * * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException diff --git a/uw_cfg_common.routing.yml b/uw_cfg_common.routing.yml index 946c06d..4aca79c 100644 --- a/uw_cfg_common.routing.yml +++ b/uw_cfg_common.routing.yml @@ -41,4 +41,3 @@ uw_cfg_common.uw_content_report_csv: _controller: \Drupal\uw_cfg_common\Controller\UwDownloadCsvController::uwContentReport requirements: _permission: 'view UW CSV reports' - -- GitLab From 4f57da0c47f63ab29ef0eea03a82ad9544b2074b Mon Sep 17 00:00:00 2001 From: Kevin Paxman Date: Mon, 19 Sep 2022 11:15:22 -0400 Subject: [PATCH 07/13] ISTWCMS-5753: make csv content report published status show yes/no --- src/Controller/UwDownloadCsvController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controller/UwDownloadCsvController.php b/src/Controller/UwDownloadCsvController.php index f10ae63..dbabf31 100644 --- a/src/Controller/UwDownloadCsvController.php +++ b/src/Controller/UwDownloadCsvController.php @@ -96,7 +96,7 @@ class UwDownloadCsvController extends ControllerBase { 'title' => '"' . $node->getTitle() . '"', 'type' => $node->type->entity->label(), 'path' => $this->pathAlias->getAliasByPath('/node/' . $node->id()), - 'published' => $node->status->value, + 'published' => $node->status->value == 1 ? 'yes' : 'no', 'created' => date('Y-d-m G:i', $node->getCreatedTime()), 'updated' => date('Y-d-m G:i', $node->getChangedTime()), ]; -- GitLab From e2ff2bba532d78a92b4b258c654d2d60fc927c26 Mon Sep 17 00:00:00 2001 From: Kevin Paxman Date: Mon, 19 Sep 2022 11:29:30 -0400 Subject: [PATCH 08/13] ISTWCMS-5753: add site name to CSV content report filename --- src/Controller/UwDownloadCsvController.php | 8 +++++++- uw_cfg_common.info.yml | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Controller/UwDownloadCsvController.php b/src/Controller/UwDownloadCsvController.php index dbabf31..4d4ee16 100644 --- a/src/Controller/UwDownloadCsvController.php +++ b/src/Controller/UwDownloadCsvController.php @@ -111,9 +111,15 @@ class UwDownloadCsvController extends ControllerBase { // Create the response for the CSV page. $response = new Response($content); + // Determine the filename for the CSV. + $sitename = \Drupal::config('system.site')->get('name'); + $filename = $sitename . '_content_report.csv'; + // Make sure we are using a safe filename. + $filename = \Drupal::service('transliterate_filenames.sanitize_name')->sanitizeFilename($filename); + // Set the headers for the CSV. $response->headers->set('Content-Type', 'text/csv'); - $response->headers->set('Content-Disposition', 'attachment; filename="content_report.csv"'); + $response->headers->set('Content-Disposition', 'attachment; filename="' . $filename . '"'); } return $response; diff --git a/uw_cfg_common.info.yml b/uw_cfg_common.info.yml index ea72008..d81086c 100644 --- a/uw_cfg_common.info.yml +++ b/uw_cfg_common.info.yml @@ -55,4 +55,5 @@ dependencies: - 'scheduler:scheduler' - 'simple_sitemap:simple_sitemap' - 'subpathauto:subpathauto' + - 'transliterate_filenames:transliterate_filenames' - 'uw_media:uw_media' -- GitLab From ae2a491af9b4b4604aa79acec5dfbad4278a94b5 Mon Sep 17 00:00:00 2001 From: Kevin Paxman Date: Mon, 19 Sep 2022 11:37:45 -0400 Subject: [PATCH 09/13] ISTWCMS-5753: UW standards - title case for content report title --- uw_cfg_common.routing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uw_cfg_common.routing.yml b/uw_cfg_common.routing.yml index 4aca79c..5055c6b 100644 --- a/uw_cfg_common.routing.yml +++ b/uw_cfg_common.routing.yml @@ -37,7 +37,7 @@ uw_cfg_common.content_type_usage_page: uw_cfg_common.uw_content_report_csv: path: '/admin/reports/uw_content_report_csv' defaults: - _title: 'Download UW Content Report (CSV)' + _title: 'Download UW content report (CSV)' _controller: \Drupal\uw_cfg_common\Controller\UwDownloadCsvController::uwContentReport requirements: _permission: 'view UW CSV reports' -- GitLab From c5193bee9e6474e4052338887cef9811a2913d3d Mon Sep 17 00:00:00 2001 From: Kevin Paxman Date: Mon, 19 Sep 2022 11:51:37 -0400 Subject: [PATCH 10/13] ISTWCMS-5753: ensure the title in the content report is CSV-safe --- src/Controller/UwDownloadCsvController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Controller/UwDownloadCsvController.php b/src/Controller/UwDownloadCsvController.php index 4d4ee16..58412d2 100644 --- a/src/Controller/UwDownloadCsvController.php +++ b/src/Controller/UwDownloadCsvController.php @@ -90,10 +90,10 @@ class UwDownloadCsvController extends ControllerBase { // Step through each of the nodes and get the info. foreach ($nodes as $node) { - // Pull out the info about the node. + // Pull out the info about the node, making sure the title is CSV-safe. $data = [ 'nid' => $node->id(), - 'title' => '"' . $node->getTitle() . '"', + 'title' => '"' . str_replace('"', '""', $node->getTitle()) . '"', 'type' => $node->type->entity->label(), 'path' => $this->pathAlias->getAliasByPath('/node/' . $node->id()), 'published' => $node->status->value == 1 ? 'yes' : 'no', -- GitLab From 8f8509560cc89982cf46ad635f3ac6152aeb3cb0 Mon Sep 17 00:00:00 2001 From: Eric Bremner Date: Mon, 19 Sep 2022 13:39:22 -0400 Subject: [PATCH 11/13] ISTWCMS-5753: adding DI for uw content report --- src/Controller/UwDownloadCsvController.php | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/Controller/UwDownloadCsvController.php b/src/Controller/UwDownloadCsvController.php index 58412d2..ffd6726 100644 --- a/src/Controller/UwDownloadCsvController.php +++ b/src/Controller/UwDownloadCsvController.php @@ -5,6 +5,7 @@ namespace Drupal\uw_cfg_common\Controller; use Drupal\Core\Controller\ControllerBase; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\path_alias\AliasManager; +use Drupal\transliterate_filenames\SanitizeName; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\Response; @@ -27,6 +28,13 @@ class UwDownloadCsvController extends ControllerBase { */ protected $pathAlias; + /** + * Sanitize name. + * + * @var Drupal\transliterate_filenames\SanitizeName + */ + protected $sanitizeName; + /** * CSV Report constructor. * @@ -34,13 +42,18 @@ class UwDownloadCsvController extends ControllerBase { * The entity type manager. * @param Drupal\path_alias\AliasManager $pathAlias * The path alias. + * @param Drupal\transliterate_filenames\SanitizeName $sanitizeName + * The sanitize name. */ public function __construct( EntityTypeManagerInterface $entityTypeManager, - AliasManager $pathAlias + AliasManager $pathAlias, + SanitizeName $sanitizeName ) { + $this->entityTypeManager = $entityTypeManager; $this->pathAlias = $pathAlias; + $this->sanitizeName = $sanitizeName; } /** @@ -49,7 +62,8 @@ class UwDownloadCsvController extends ControllerBase { public static function create(ContainerInterface $container) { return new static( $container->get('entity_type.manager'), - $container->get('path_alias.manager') + $container->get('path_alias.manager'), + $container->get('transliterate_filenames.sanitize_name') ); } @@ -114,8 +128,9 @@ class UwDownloadCsvController extends ControllerBase { // Determine the filename for the CSV. $sitename = \Drupal::config('system.site')->get('name'); $filename = $sitename . '_content_report.csv'; + // Make sure we are using a safe filename. - $filename = \Drupal::service('transliterate_filenames.sanitize_name')->sanitizeFilename($filename); + $filename = $this->sanitizeName->sanitizeFilename($filename); // Set the headers for the CSV. $response->headers->set('Content-Type', 'text/csv'); -- GitLab From 50d837c9db193cd41962324a2931cb0db8a8fb9e Mon Sep 17 00:00:00 2001 From: Eric Bremner Date: Mon, 19 Sep 2022 13:54:04 -0400 Subject: [PATCH 12/13] ISTWCMS-5753: fixing DI for csv content report --- src/Controller/UwDownloadCsvController.php | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/Controller/UwDownloadCsvController.php b/src/Controller/UwDownloadCsvController.php index ffd6726..bf84c80 100644 --- a/src/Controller/UwDownloadCsvController.php +++ b/src/Controller/UwDownloadCsvController.php @@ -2,6 +2,7 @@ namespace Drupal\uw_cfg_common\Controller; +use Drupal\Core\Config\ConfigFactory; use Drupal\Core\Controller\ControllerBase; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\path_alias\AliasManager; @@ -35,6 +36,13 @@ class UwDownloadCsvController extends ControllerBase { */ protected $sanitizeName; + /** + * The config factory. + * + * @var \Drupal\Core\Config\ConfigFactory + */ + protected $configFactory; + /** * CSV Report constructor. * @@ -44,16 +52,20 @@ class UwDownloadCsvController extends ControllerBase { * The path alias. * @param Drupal\transliterate_filenames\SanitizeName $sanitizeName * The sanitize name. + * @param Drupal\Core\Config\ConfigFactory $configFactory + * The config factory. */ public function __construct( EntityTypeManagerInterface $entityTypeManager, AliasManager $pathAlias, - SanitizeName $sanitizeName + SanitizeName $sanitizeName, + ConfigFactory $configFactory ) { $this->entityTypeManager = $entityTypeManager; $this->pathAlias = $pathAlias; $this->sanitizeName = $sanitizeName; + $this->configFactory = $configFactory; } /** @@ -63,7 +75,8 @@ class UwDownloadCsvController extends ControllerBase { return new static( $container->get('entity_type.manager'), $container->get('path_alias.manager'), - $container->get('transliterate_filenames.sanitize_name') + $container->get('transliterate_filenames.sanitize_name'), + $container->get('config.factory') ); } @@ -126,7 +139,7 @@ class UwDownloadCsvController extends ControllerBase { $response = new Response($content); // Determine the filename for the CSV. - $sitename = \Drupal::config('system.site')->get('name'); + $sitename = $this->configFactory->get('system.site')->get('name'); $filename = $sitename . '_content_report.csv'; // Make sure we are using a safe filename. -- GitLab From eb04866b9c6afdeeab5f065ae315d2285941cdb6 Mon Sep 17 00:00:00 2001 From: Eric Bremner Date: Mon, 19 Sep 2022 13:55:15 -0400 Subject: [PATCH 13/13] ISTWCMS-5753: coding standards --- src/Controller/UwDownloadCsvController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controller/UwDownloadCsvController.php b/src/Controller/UwDownloadCsvController.php index bf84c80..54876fd 100644 --- a/src/Controller/UwDownloadCsvController.php +++ b/src/Controller/UwDownloadCsvController.php @@ -52,7 +52,7 @@ class UwDownloadCsvController extends ControllerBase { * The path alias. * @param Drupal\transliterate_filenames\SanitizeName $sanitizeName * The sanitize name. - * @param Drupal\Core\Config\ConfigFactory $configFactory + * @param Drupal\Core\Config\ConfigFactory $configFactory * The config factory. */ public function __construct( -- GitLab