01tonythomas has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/281292

Change subject: Allow listing of Newsletter issues for a given newsletter
......................................................................

Allow listing of Newsletter issues for a given newsletter

Made a new subpage Special:Newsletter/id/issues which would list down the
issues using a TablePager class

Bug: T131682
Change-Id: I4d224d619e40472a3163f8655ef4b17168ec00d4
---
M extension.json
M i18n/en.json
M i18n/qqq.json
M includes/specials/SpecialNewsletter.php
A includes/specials/pagers/NewsletterIssuesTablePager.php
5 files changed, 165 insertions(+), 6 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Newsletter 
refs/changes/92/281292/1

diff --git a/extension.json b/extension.json
index 78d915d..0a027c6 100644
--- a/extension.json
+++ b/extension.json
@@ -63,6 +63,7 @@
                "SpecialNewsletters": 
"includes/specials/SpecialNewsletters.php",
                "SpecialNewsletterCreate": 
"includes/specials/SpecialNewsletterCreate.php",
                "NewsletterTablePager": 
"includes/specials/pagers/NewsletterTablePager.php",
+               "NewsletterIssuesTablePager": 
"includes/specials/pagers/NewsletterIssuesTablePager.php",
                "ApiNewsletterManage": "includes/api/ApiNewsletterManage.php",
                "ApiNewsletterSubscribe": 
"includes/api/ApiNewsletterSubscribe.php",
                "EchoNewsletterPresentationModel": 
"includes/Echo/EchoNewsletterPresentationModel.php",
diff --git a/i18n/en.json b/i18n/en.json
index be33eb2..dfb9ee8 100755
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -29,9 +29,11 @@
        "newsletter-subtitlelinks-announce": "announce",
        "newsletter-subtitlelinks-manage": "manage",
        "newsletter-subtitlelinks-delete": "delete",
+       "newsletter-subtitlelinks-issues": "issues",
        "newsletters": "Newsletters",
        "newsletter-subscribe-loginrequired": "Please log in to subscribe to 
[[Special:Newsletters|newsletters]].",
        "newsletter-notfound": "Newsletter not found",
+       "newsletter-issue-none-found": "No issues found for this Newsletter",
        "newsletter-not-found-id": "A newsletter with this ID does not exist. A 
[[Special:Newsletters|list of existing newsletters]] is available.",
        "newsletter-view": "View newsletter details",
        "newsletter-view-name": "Newsletter name:",
@@ -45,6 +47,7 @@
        "newsletter-unsubscribe-button": "Unsubscribe",
        "newsletter-subscribe-button": "Subscribe",
        "newsletter-announce-button": "Announce",
+       "newsletter-issues-button": "Issues",
        "newsletter-announce-nopermission": "You are not a publisher for this 
newsletter.",
        "newsletter-announce": "Announce a new issue of \"$1\"",
        "newsletter-announce-submit": "Announce",
@@ -106,6 +109,8 @@
        "newsletter-header-description": "Description",
        "newsletter-header-action": "Subscribed?",
        "newsletter-header-subscriber_count": "Subscriber count",
+       "newsletter-header-issue_name": "Issue",
+       "newsletter-header-issue_publisher": "Publisher",
        "newsletter-delete-confirmation": "Are you sure you want to delete this 
newsletter?",
        "newsletter-delete-confirm-details": "Note that this action is not 
reversible and data cannot be restored once it has been deleted.",
        "newsletter-delete-confirm-cancel": "Cancel",
diff --git a/i18n/qqq.json b/i18n/qqq.json
index b928c3b..574ffba 100644
--- a/i18n/qqq.json
+++ b/i18n/qqq.json
@@ -28,14 +28,16 @@
        "newsletter-create-short-description-error": "Error message shown on 
[[Special:CreateNewsletter]] if the text entered in the description field is 
too short.",
        "newsletter-subtitlelinks-list": "Label for link to 
[[Special:Newsletters]] shown under the header on Newsletter special 
pages.\n\nSee also:\n* {{msg-mw|newsletter-subtitlelinks-create}}",
        "newsletter-subtitlelinks-create": "Label for link to 
[[Special:CreateNewsletter]] shown under the header on Newsletter special 
pages.\n\nSee also:\n* {{msg-mw|newsletter-subtitlelinks-list}}",
-       "newsletter-subtitlelinks-unsubscribe": "Label for link to 
Special:Newsletter unsubscribe page. \n\nSee also:\n* 
{{msg-mw|newsletter-subtitlelinks-subscribe}}\n* 
{{msg-mw|newsletter-subtitlelinks-announce}}\n* 
{{msg-mw|newsletter-subtitlelinks-manage}}\n* 
{{msg-mw|newsletter-subtitlelinks-delete}}\n{{Identical|Unsubscribe}}",
-       "newsletter-subtitlelinks-subscribe": "Label for link to 
Special:Newsletter subscribe page. Used as a navigation link on 
Special:Newsletter.\n\nSee also:\n* 
{{msg-mw|newsletter-subtitlelinks-unsubscribe}}\n* 
{{msg-mw|newsletter-subtitlelinks-announce}}\n* 
{{msg-mw|newsletter-subtitlelinks-manage}}\n* 
{{msg-mw|newsletter-subtitlelinks-delete}}\n{{Identical|Subscribe}}",
-       "newsletter-subtitlelinks-announce": "Label for link to 
Special:Newsletter announce page. Used as a navigation link on 
Special:Newsletter.\n\nSee also:\n* 
{{msg-mw|newsletter-subtitlelinks-subscribe}}\n* 
{{msg-mw|newsletter-subtitlelinks-unsubscribe}}\n* 
{{msg-mw|newsletter-subtitlelinks-announce}}\n* 
{{msg-mw|newsletter-subtitlelinks-manage}}\n* 
{{msg-mw|newsletter-subtitlelinks-delete}}\n{{Identical|Announce}}",
-       "newsletter-subtitlelinks-manage": "Label for link to 
Special:Newsletter manage page. Used as a navigation link on 
Special:Newsletter.\n\nSee also:\n* 
{{msg-mw|newsletter-subtitlelinks-subscribe}}\n* 
{{msg-mw|newsletter-subtitlelinks-unsubscribe}}\n* 
{{msg-mw|newsletter-subtitlelinks-announce}}\n* 
{{msg-mw|newsletter-subtitlelinks-delete}}\n{{Identical|Collaborator}}",
-       "newsletter-subtitlelinks-delete": "Label for link to 
Special:Newsletter delete page. Used as a navigation link on 
Special:Newsletter.\n\nSee also:\n* 
{{msg-mw|newsletter-subtitlelinks-subscribe}}\n* 
{{msg-mw|newsletter-subtitlelinks-unsubscribe}}\n* 
{{msg-mw|newsletter-subtitlelinks-announce}}\n* 
{{msg-mw|newsletter-subtitlelinks-manage}}\n{{Identical|Delete}}",
+       "newsletter-subtitlelinks-unsubscribe": "Label for link to 
Special:Newsletter unsubscribe page. \n\nSee also:\n* 
{{msg-mw|newsletter-subtitlelinks-subscribe}}\n* 
{{msg-mw|newsletter-subtitlelinks-announce}}\n* 
{{msg-mw|newsletter-subtitlelinks-manage}}\n* 
{{msg-mw|newsletter-subtitlelinks-delete}}\n* 
{{msg-mw|newsletter-subtitlelinks-issues}}\n{{Identical|Unsubscribe}}",
+       "newsletter-subtitlelinks-subscribe": "Label for link to 
Special:Newsletter subscribe page. Used as a navigation link on 
Special:Newsletter.\n\nSee also:\n* 
{{msg-mw|newsletter-subtitlelinks-unsubscribe}}\n* 
{{msg-mw|newsletter-subtitlelinks-announce}}\n* 
{{msg-mw|newsletter-subtitlelinks-manage}}\n* 
{{msg-mw|newsletter-subtitlelinks-delete}}\n* 
{{msg-mw|newsletter-subtitlelinks-issues}}\n{{Identical|Subscribe}}",
+       "newsletter-subtitlelinks-announce": "Label for link to 
Special:Newsletter announce page. Used as a navigation link on 
Special:Newsletter.\n\nSee also:\n* 
{{msg-mw|newsletter-subtitlelinks-subscribe}}\n* 
{{msg-mw|newsletter-subtitlelinks-unsubscribe}}\n* 
{{msg-mw|newsletter-subtitlelinks-announce}}\n* 
{{msg-mw|newsletter-subtitlelinks-manage}}\n* 
{{msg-mw|newsletter-subtitlelinks-delete}}\n* 
{{msg-mw|newsletter-subtitlelinks-issues}}\n{{Identical|Announce}}",
+       "newsletter-subtitlelinks-manage": "Label for link to 
Special:Newsletter manage page. Used as a navigation link on 
Special:Newsletter.\n\nSee also:\n* 
{{msg-mw|newsletter-subtitlelinks-subscribe}}\n* 
{{msg-mw|newsletter-subtitlelinks-unsubscribe}}\n* 
{{msg-mw|newsletter-subtitlelinks-announce}}\n* 
{{msg-mw|newsletter-subtitlelinks-delete}}\n* 
{{msg-mw|newsletter-subtitlelinks-issues}}\n{{Identical|Collaborator}}",
+       "newsletter-subtitlelinks-delete": "Label for link to 
Special:Newsletter delete page. Used as a navigation link on 
Special:Newsletter.\n\nSee also:\n* 
{{msg-mw|newsletter-subtitlelinks-subscribe}}\n* 
{{msg-mw|newsletter-subtitlelinks-unsubscribe}}\n* 
{{msg-mw|newsletter-subtitlelinks-announce}}\n* 
{{msg-mw|newsletter-subtitlelinks-manage}}\n* 
{{msg-mw|newsletter-subtitlelinks-issues}}\n{{Identical|Delete}}",
+       "newsletter-subtitlelinks-issues": "Label for link to 
Special:Newsletter issues page. Used as a navigation link on 
Special:Newsletter.\n\nSee also:\n* 
{{msg-mw|newsletter-subtitlelinks-subscribe}}\n* 
{{msg-mw|newsletter-subtitlelinks-unsubscribe}}\n* 
{{msg-mw|newsletter-subtitlelinks-announce}}\n* 
{{msg-mw|newsletter-subtitlelinks-manage}}\n{{Identical|Delete}}",
        "newsletters": "Name of special page for user to subscribe to or 
unsubscribe from newsletters\n{{Identical|Newsletter}}",
        "newsletter-subscribe-loginrequired": "Error message shown on the login 
form for non-logged in users if they try to visit 
Special:Newsletter/<id>/subscribe.",
        "newsletter-notfound": "Header of Special:Newsletter/<id> if no 
newsletter by that id exists.\n\nSee also:\n* 
{{msg-mw|newsletter-not-found-id}}",
+       "newsletter-issue-none-found": "Header of 
Special:Newsletter/<id>/issues if no issues for that newsletter exists.\n\nSee 
also:\n* {{msg-mw|newsletter-not-found-id}}",
        "newsletter-not-found-id": "Error message shown on 
Special:Newsletter/<id> if no newsletter by that id exists.\n\nSee also:\n* 
{{msg-mw|newsletter-notfound}}",
        "newsletter-view": "Header message shown on Special:Newsletter/<id> if 
a newsletter by the specified id exists.\n\nSee also:\n* 
{{msg-mw|newsletter-delete}}",
        "newsletter-view-name": "Label for newsletter name field. Shown on 
Special:Newsletter/<id>",
@@ -49,6 +51,7 @@
        "newsletter-unsubscribe-button": "Label for \"Unsubscribe\" button 
shown on Special:Newsletter/<id>. Links to Special:Newsletter/<id>/unsubscribe. 
Shown only for logged-in users and if the user is currently subscribed to the 
newsletter.\n{{Identical|Unsubscribe}}",
        "newsletter-subscribe-button": "Label for \"Subscribe\" button shown on 
Special:Newsletter/<id>. Links to Special:Newsletter/<id>/unsubscribe. Shown 
only for logged-in users and if the user is currently not subscribed to the 
newsletter.",
        "newsletter-announce-button": "Label of \"Announce\" button shown on 
Special:Newsletter/id.\n{{Identical|Announce}}",
+       "newsletter-issues-button": "Label of \"Announce\" button shown on 
Special:Newsletter/id.\n{{Identical|Announce}}",
        "newsletter-announce-nopermission": "Error message shown on 
Special:Newsletter/id/announce if the user is not a publisher.",
        "newsletter-announce": "Title of Special:Newsletter/id/announce. $1 is 
the name of the newsletter.",
        "newsletter-announce-submit": "Label of submit button shown on 
Special:Newsletter/id/announce\n{{Identical|Announce}}",
diff --git a/includes/specials/SpecialNewsletter.php 
b/includes/specials/SpecialNewsletter.php
index b5c5bbf..90c96b9 100644
--- a/includes/specials/SpecialNewsletter.php
+++ b/includes/specials/SpecialNewsletter.php
@@ -13,6 +13,7 @@
        const NEWSLETTER_MANAGE = 'manage';
        const NEWSLETTER_SUBSCRIBE = 'subscribe';
        const NEWSLETTER_UNSUBSCRIBE = 'unsubscribe';
+       const NEWSLETTER_ISSUES = 'issues';
 
        /**
         * @var Newsletter|null
@@ -67,6 +68,9 @@
                                case self::NEWSLETTER_DELETE:
                                        $this->doDeleteExecute();
                                        break;
+                               case self::NEWSLETTER_ISSUES:
+                                       $this->doIssuesExecute();
+                                       break;
                                default:
                                        $this->doViewExecute();
                                        $action = null;
@@ -108,6 +112,7 @@
                                ? self::NEWSLETTER_UNSUBSCRIBE
                                : self::NEWSLETTER_SUBSCRIBE;
                }
+               $actions[] = self::NEWSLETTER_ISSUES;
                if ( $this->newsletter->isPublisher( $user ) ) {
                        $actions[] = self::NEWSLETTER_ANNOUNCE;
                }
@@ -241,7 +246,7 @@
        }
 
        /**
-        * Build a group of buttons: Delete, Manage, Subscribe|Unsubscribe
+        * Build a group of buttons: Delete, Manage, Subscribe|Unsubscribe, 
Issues
         * Buttons will be showed to the user only if they are relevant to the 
current user.
         *
         * @return string HTML for the button group
@@ -251,6 +256,15 @@
                $id = $this->newsletter->getId();
                $buttons = array();
                $this->getOutput()->enableOOUI();
+
+               $buttons[] = new OOUI\ButtonWidget(
+                       array(
+                               'label' => $this->msg( 
'newsletter-issues-button' )->escaped(),
+                               'icon' => 'menu',
+                               'flags' => array( 'constructive' ),
+                               'href' => $this->getPageTitle( $id . '/' . 
self::NEWSLETTER_ISSUES )->getFullURL()
+                       )
+               );
 
                if ( $this->newsletter->canDelete( $user ) ) {
                        // This is visible to publishers and users with 
'newsletter-delete' right
@@ -492,6 +506,41 @@
                }
        }
 
+
+       protected function doIssuesExecute() {
+               $out = $this->getOutput();
+               $this->getOutput()->setPageTitle( $this->msg( 
'newsletter-issues' ) );
+
+               $pager = new NewsletterIssuesTablePager( 
$this->newsletter->getId() );
+
+               if ( $pager->getNumRows() ) {
+                       $out->addParserOutput( $pager->getFullOutput() );
+               } else {
+                       // No newsletters exist on this wiki so just show an 
error page without the form
+                       $out->showErrorPage( 'newsletters', 
'newsletter-issue-none-found' );
+               }
+               $this->getOutput()->addReturnTo( $this->getPageTitle( 
$this->newsletter->getId() ) );
+       }
+
+       private function getFormFields() {
+               return array(
+                       'filter' => array(
+                               'id' => 'mw-newsletter-filter-options',
+                               'type' => 'select',
+                               'name' => 'filter',
+                               'label-message' => 'newsletter-list-table',
+                               'options' => array(
+                                       $this->msg( 
'newsletter-list-option-all' )->escaped() => 'all',
+                                       $this->msg( 
'newsletter-list-option-subscribed' )->escaped() => 'subscribed',
+                                       $this->msg( 
'newsletter-list-option-unsubscribed' )->escaped() => 'unsubscribed'
+                               ),
+                               'default' => $this->option,
+                       ),
+               );
+       }
+
+
+
        /**
         * Submit callback for the announce form (validate, add to issues table 
and create
         * Echo event). This assumes that permissions check etc has been done 
already.
diff --git a/includes/specials/pagers/NewsletterIssuesTablePager.php 
b/includes/specials/pagers/NewsletterIssuesTablePager.php
new file mode 100644
index 0000000..4695be7
--- /dev/null
+++ b/includes/specials/pagers/NewsletterIssuesTablePager.php
@@ -0,0 +1,101 @@
+<?php
+
+/**
+ * @license GNU GPL v2+
+ * @author Tony Thomas
+ * @todo Optimize queries here
+ */
+class NewsletterIssuesTablePager extends TablePager {
+
+       /**
+        * @var string[]
+        */
+       private $fieldNames;
+
+       /**
+        * @var int
+        */
+       private $newsletterId;
+
+       public function __construct( $newsletterId, IContextSource $context = 
null, IDatabase $readDb = null ) {
+               $this->newsletterId = $newsletterId;
+               if ( $readDb !== null ) {
+                       $this->mDb = $readDb;
+               }
+               parent::__construct( $context );
+       }
+
+       public function getFieldNames() {
+               if ( $this->fieldNames === null ) {
+                       $this->fieldNames = array(
+                               'nli_page_id' => $this->msg( 
'newsletter-header-issue_name' )->escaped(),
+                               'nli_publisher_id' => $this->msg( 
'newsletter-header-issue_publisher' )->escaped(),
+                       );
+               }
+
+               return $this->fieldNames;
+       }
+
+       public function getQueryInfo() {
+               $info = array(
+                       'tables' => array( 'nl_issues' ),
+                       'fields' => array(
+                               'nli_page_id',
+                               'nli_issue_id',
+                               'nli_publisher_id',
+                       ),
+                       'options' => array( 'DISTINCT nli_newsletter_id' ),
+               );
+
+               $info['conds'] = array( 'nli_newsletter_id' => 
$this->newsletterId );
+
+               return $info;
+       }
+
+       public function formatValue( $field, $value ) {
+               switch ( $field ) {
+                       case 'nli_page_id':
+                               $title = Title::newFromID( $value );
+                               if ( $title ) {
+                                       return Linker::linkKnown( $title );
+                               } else {
+                                       return htmlspecialchars( $value );
+                               }
+                       case 'nli_publisher_id':
+                               return User::newFromId( $value );
+               }
+       }
+
+       /*
+        * @return array
+        */
+       public function getCellAttrs( $field, $value ) {
+               $ret = parent::getCellAttrs( $field, $value );
+               // @todo use CSS, not inline HTML
+               switch ( $field ) {
+                       case 'nli_page_id':
+                               $ret['width'] = '70%';
+                               break;
+                       case 'nli_publisher_id':
+                               $ret['width'] = '30%';
+                               break;
+               }
+
+               return $ret;
+       }
+
+       public function getDefaultSort() {
+               $this->mDefaultDirection = IndexPager::DIR_DESCENDING;
+               $sort = 'nli_issue_id';
+               return $sort;
+       }
+
+       public function isFieldSortable( $field ) {
+               return false;
+       }
+
+       public function setUserOption( $value ) {
+               $this->option = $value;
+       }
+
+}

-- 
To view, visit https://gerrit.wikimedia.org/r/281292
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I4d224d619e40472a3163f8655ef4b17168ec00d4
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Newsletter
Gerrit-Branch: master
Gerrit-Owner: 01tonythomas <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to