}
public function execute( $par ) {
+ global $wgActorTableSchemaMigrationStage;
+
$this->setHeaders();
$this->outputHeader();
$this->getOutput()->addModules( 'mediawiki.userSuggest' );
$opts->add( 'pattern', false );
$opts->add( 'year', null, FormOptions::INTNULL );
$opts->add( 'month', null, FormOptions::INTNULL );
+ $opts->add( 'day', null, FormOptions::INTNULL );
$opts->add( 'tagfilter', '' );
$opts->add( 'offset', '' );
$opts->add( 'dir', '' );
$opts->add( 'offender', '' );
$opts->add( 'subtype', '' );
+ $opts->add( 'logid', '' );
// Set values
$opts->fetchValuesFromRequest( $this->getRequest() );
$this->parseParams( $opts, (string)$par );
}
+ // Set date values
+ $dateString = $this->getRequest()->getVal( 'wpdate' );
+ if ( !empty( $dateString ) ) {
+ $dateStamp = MWTimestamp::getInstance( $dateString . ' 00:00:00' );
+ $dateStamp->setTimezone( $this->getConfig()->get( 'Localtimezone' ) );
+
+ $opts->setValue( 'year', (int)$dateStamp->format( 'Y' ) );
+ $opts->setValue( 'month', (int)$dateStamp->format( 'm' ) );
+ $opts->setValue( 'day', (int)$dateStamp->format( 'd' ) );
+ }
+
# Don't let the user get stuck with a certain date
if ( $opts->getValue( 'offset' ) || $opts->getValue( 'dir' ) == 'prev' ) {
$opts->setValue( 'year', '' );
# Handle type-specific inputs
$qc = [];
if ( $opts->getValue( 'type' ) == 'suppress' ) {
- $offender = User::newFromName( $opts->getValue( 'offender' ), false );
+ $offenderName = $opts->getValue( 'offender' );
+ $offender = empty( $offenderName ) ? null : User::newFromName( $offenderName, false );
if ( $offender ) {
- if ( $offender->getId() > 0 ) {
- $qc = [ 'ls_field' => 'target_author_id', 'ls_value' => $offender->getId() ];
+ if ( $wgActorTableSchemaMigrationStage === MIGRATION_NEW ) {
+ $qc = [ 'ls_field' => 'target_author_actor', 'ls_value' => $offender->getActorId() ];
} else {
- $qc = [ 'ls_field' => 'target_author_ip', 'ls_value' => $offender->getName() ];
+ if ( $offender->getId() > 0 ) {
+ $field = 'target_author_id';
+ $value = $offender->getId();
+ } else {
+ $field = 'target_author_ip';
+ $value = $offender->getName();
+ }
+ if ( !$offender->getActorId() ) {
+ $qc = [ 'ls_field' => $field, 'ls_value' => $value ];
+ } else {
+ $db = wfGetDB( DB_REPLICA );
+ $qc = [
+ 'ls_field' => [ 'target_author_actor', $field ], // So LogPager::getQueryInfo() works right
+ $db->makeList( [
+ $db->makeList(
+ [ 'ls_field' => 'target_author_actor', 'ls_value' => $offender->getActorId() ], LIST_AND
+ ),
+ $db->makeList( [ 'ls_field' => $field, 'ls_value' => $value ], LIST_AND ),
+ ], LIST_OR ),
+ ];
+ }
}
}
} else {
return $subpages;
}
+ /**
+ * Set options based on the subpage title parts:
+ * - One part that is a valid log type: Special:Log/logtype
+ * - Two parts: Special:Log/logtype/username
+ * - Otherwise, assume the whole subpage is a username.
+ *
+ * @param FormOptions $opts
+ * @param $par
+ * @throws ConfigException
+ */
private function parseParams( FormOptions $opts, $par ) {
# Get parameters
$par = $par !== null ? $par : '';
$extraConds,
$opts->getValue( 'year' ),
$opts->getValue( 'month' ),
+ $opts->getValue( 'day' ),
$opts->getValue( 'tagfilter' ),
- $opts->getValue( 'subtype' )
+ $opts->getValue( 'subtype' ),
+ $opts->getValue( 'logid' )
);
$this->addHeader( $opts->getValue( 'type' ) );
$pager->getPattern(),
$pager->getYear(),
$pager->getMonth(),
+ $pager->getDay(),
$pager->getFilterParams(),
$pager->getTagFilter(),
$pager->getAction()