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