wiki.techinc.nl/includes/WatchedItem.php

201 lines
5 KiB
PHP
Raw Normal View History

<?php
/**
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
* @ingroup Watchlist
*/
use MediaWiki\MediaWikiServices;
use MediaWiki\Linker\LinkTarget;
/**
* Representation of a pair of user and title for watchlist entries.
*
* @author Tim Starling
* @author Addshore
*
* @ingroup Watchlist
*/
class WatchedItem {
/**
* @deprecated since 1.27, see User::IGNORE_USER_RIGHTS
*/
const IGNORE_USER_RIGHTS = User::IGNORE_USER_RIGHTS;
/**
* @deprecated since 1.27, see User::CHECK_USER_RIGHTS
*/
const CHECK_USER_RIGHTS = User::CHECK_USER_RIGHTS;
2005-01-27 17:56:04 +00:00
/**
* @deprecated Internal class use only
2005-01-27 17:56:04 +00:00
*/
const DEPRECATED_USAGE_TIMESTAMP = -100;
/**
* @var bool
* @deprecated Internal class use only
*/
public $checkRights = User::CHECK_USER_RIGHTS;
/**
* @var Title
* @deprecated Internal class use only
*/
private $title;
/**
* @var LinkTarget
*/
private $linkTarget;
/**
* @var User
*/
private $user;
/**
* @var null|string the value of the wl_notificationtimestamp field
*/
private $notificationTimestamp;
/**
* @param User $user
* @param LinkTarget $linkTarget
* @param null|string $notificationTimestamp the value of the wl_notificationtimestamp field
* @param bool|null $checkRights DO NOT USE - used internally for backward compatibility
*/
public function __construct(
User $user,
LinkTarget $linkTarget,
$notificationTimestamp,
$checkRights = null
) {
$this->user = $user;
$this->linkTarget = $linkTarget;
$this->notificationTimestamp = $notificationTimestamp;
if ( $checkRights !== null ) {
$this->checkRights = $checkRights;
}
}
/**
* @return User
*/
public function getUser() {
return $this->user;
}
/**
* @return LinkTarget
*/
public function getLinkTarget() {
return $this->linkTarget;
}
/**
* Get the notification timestamp of this entry.
*
* @return bool|null|string
*/
public function getNotificationTimestamp() {
// Back compat for objects constructed using self::fromUserTitle
if ( $this->notificationTimestamp === self::DEPRECATED_USAGE_TIMESTAMP ) {
// wfDeprecated( __METHOD__, '1.27' );
if ( $this->checkRights && !$this->user->isAllowed( 'viewmywatchlist' ) ) {
return false;
}
$item = MediaWikiServices::getInstance()->getWatchedItemStore()
->loadWatchedItem( $this->user, $this->linkTarget );
if ( $item ) {
$this->notificationTimestamp = $item->getNotificationTimestamp();
} else {
$this->notificationTimestamp = false;
}
}
return $this->notificationTimestamp;
}
/**
* Back compat pre 1.27 with the WatchedItemStore introduction
* @todo remove in 1.28/9
* -------------------------------------------------
*/
/**
* @return Title
* @deprecated Internal class use only
*/
public function getTitle() {
if ( !$this->title ) {
$this->title = Title::newFromLinkTarget( $this->linkTarget );
}
return $this->title;
}
/**
* @deprecated since 1.27 Use the constructor, WatchedItemStore::getWatchedItem()
* or WatchedItemStore::loadWatchedItem()
*/
public static function fromUserTitle( $user, $title, $checkRights = User::CHECK_USER_RIGHTS ) {
wfDeprecated( __METHOD__, '1.27' );
return new self( $user, $title, self::DEPRECATED_USAGE_TIMESTAMP, (bool)$checkRights );
}
Correctly update wl_notificationtimestamp when viewing old revisions == Prelude == wl_notificationtimestamp controls sending the user e-mail notifications about changes to pages, as well as showing the "updated since last visit" markers on history pages, recent changes and watchlist. == The bug == Previously, on every view of a page, the notification timestamp was cleared, regardless of whether the user as actually viewing the latest revision. When viewing a diff, however, the timestamp was cleared only if one of the revisions being compared was the latest one of its page. The same behavior applied to talk page message indicators (which are actually stored sepately to cater to anonymous users). This was inconsistent and surprising when one was attempting to, say, go through the 50 new posts to a discussion page in a peacemeal fashion. == The fix == If the revision being viewed is the latest (or can't be determined), the timestamp is cleared as previously, as this is necessary to reenable e-mail notifications for given user and page. If the revision isn't the latest, the timestamp is updated to revision's timestamp plus one second. This uses up to two simple (selectField) indexed queries per page view, only fired when we do not already know we're looking at the latest version. Talk page indicator is updated to point at the next revision after the one being viewed, or cleared if viewing the latest revision. The UserClearNewTalkNotification hook gained $oldid as the second argument (a backwards-compatible change). In Skin, we no longer ignore the indicator being present if we're viewing the talk page, as it might still be valid. == The bonus == Comments and formatting was updated in a few places, including tables.sql and Wiki.php. The following functions gained a second, optional $oldid parameter (holy indirection, Batman!): * WikiPage#doViewUpdates() * User#clearNotification() * WatchedItem#resetNotificationTimestamp() DifferenceEngine gained a public method mapDiffPrevNext() used to parse the ids from URL parameters like oldid=12345&diff=prev, factored out of loadRevisionIds(). A bug where the NewDifferenceEngine hook would not be called in some cases, dating back to its introduction in r45518, was fixed in the process. Bug: 41759 Change-Id: I4144ba1987b8d7a7e8b24f4f067eedac2ae44459
2013-09-16 10:31:40 +00:00
/**
* @deprecated since 1.27 Use User::addWatch()
* @return bool
*/
public function addWatch() {
wfDeprecated( __METHOD__, '1.27' );
$this->user->addWatch( $this->getTitle(), $this->checkRights );
return true;
}
/**
* @deprecated since 1.27 Use User::removeWatch()
* @return bool
*/
public function removeWatch() {
wfDeprecated( __METHOD__, '1.27' );
if ( $this->checkRights && !$this->user->isAllowed( 'editmywatchlist' ) ) {
return false;
}
$this->user->removeWatch( $this->getTitle(), $this->checkRights );
return true;
}
/**
* @deprecated since 1.27 Use User::isWatched()
* @return bool
*/
public function isWatched() {
wfDeprecated( __METHOD__, '1.27' );
return $this->user->isWatched( $this->getTitle(), $this->checkRights );
}
/**
* @deprecated since 1.27 Use WatchedItemStore::duplicateAllAssociatedEntries()
*/
public static function duplicateEntries( Title $oldTitle, Title $newTitle ) {
wfDeprecated( __METHOD__, '1.27' );
$store = MediaWikiServices::getInstance()->getWatchedItemStore();
$store->duplicateAllAssociatedEntries( $oldTitle, $newTitle );
}
2006-01-07 13:31:29 +00:00
}