protected function getMessageParameters() {
$params = parent::getMessageParameters();
- // Really old entries
+ // Really old entries that lack old/new groups
if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
return $params;
}
$userName = $this->entry->getTarget()->getText();
if ( !$this->plaintext && count( $oldGroups ) ) {
foreach ( $oldGroups as &$group ) {
- $group = User::getGroupMember( $group, $userName );
+ $group = UserGroupMembership::getGroupMemberName( $group, $userName );
}
}
if ( !$this->plaintext && count( $newGroups ) ) {
foreach ( $newGroups as &$group ) {
- $group = User::getGroupMember( $group, $userName );
+ $group = UserGroupMembership::getGroupMemberName( $group, $userName );
}
}
- $lang = $this->context->getLanguage();
+ // fetch the metadata about each group membership
+ $allParams = $this->entry->getParameters();
+
if ( count( $oldGroups ) ) {
- $params[3] = $lang->listToText( $oldGroups );
+ $params[3] = [ 'raw' => $this->formatRightsList( $oldGroups,
+ isset( $allParams['oldmetadata'] ) ? $allParams['oldmetadata'] : [] ) ];
} else {
$params[3] = $this->msg( 'rightsnone' )->text();
}
if ( count( $newGroups ) ) {
// Array_values is used here because of T44211
// see use of array_unique in UserrightsPage::doSaveUserGroups on $newGroups.
- $params[4] = $lang->listToText( array_values( $newGroups ) );
+ $params[4] = [ 'raw' => $this->formatRightsList( array_values( $newGroups ),
+ isset( $allParams['newmetadata'] ) ? $allParams['newmetadata'] : [] ) ];
} else {
$params[4] = $this->msg( 'rightsnone' )->text();
}
return $params;
}
+ protected function formatRightsList( $groups, $serializedUGMs = [] ) {
+ $uiLanguage = $this->context->getLanguage();
+ $uiUser = $this->context->getUser();
+ // separate arrays of temporary and permanent memberships
+ $tempList = $permList = [];
+
+ reset( $groups );
+ reset( $serializedUGMs );
+ while ( current( $groups ) ) {
+ $group = current( $groups );
+
+ if ( current( $serializedUGMs ) &&
+ isset( current( $serializedUGMs )['expiry'] ) &&
+ current( $serializedUGMs )['expiry']
+ ) {
+ // there is an expiry date; format the group and expiry into a friendly string
+ $expiry = current( $serializedUGMs )['expiry'];
+ $expiryFormatted = $uiLanguage->userTimeAndDate( $expiry, $uiUser );
+ $expiryFormattedD = $uiLanguage->userDate( $expiry, $uiUser );
+ $expiryFormattedT = $uiLanguage->userTime( $expiry, $uiUser );
+ $tempList[] = $this->msg( 'rightslogentry-temporary-group' )->params( $group,
+ $expiryFormatted, $expiryFormattedD, $expiryFormattedT )->parse();
+ } else {
+ // the right does not expire; just insert the group name
+ $permList[] = $group;
+ }
+
+ next( $groups );
+ next( $serializedUGMs );
+ }
+
+ // place all temporary memberships first, to avoid the ambiguity of
+ // "adinistrator, bureaucrat and importer (temporary, until X time)"
+ return $uiLanguage->listToText( array_merge( $tempList, $permList ) );
+ }
+
protected function getParametersForApi() {
$entry = $this->entry;
$params = $entry->getParameters();
}
}
- // Really old entries does not have log params
+ // Really old entries do not have log params, so form them from whatever info
+ // we have.
+ // Also walk through the parallel arrays of groups and metadata, combining each
+ // metadata array with the name of the group it pertains to
if ( isset( $params['4:array:oldgroups'] ) ) {
$params['4:array:oldgroups'] = $this->makeGroupArray( $params['4:array:oldgroups'] );
+
+ $oldmetadata =& $params['oldmetadata'];
+ // unset old metadata entry to ensure metadata goes at the end of the params array
+ unset( $params['oldmetadata'] );
+ $params['oldmetadata'] = array_map( function ( $index ) use ( $params, $oldmetadata ) {
+ $result = [ 'group' => $params['4:array:oldgroups'][$index] ];
+ if ( isset( $oldmetadata[$index] ) ) {
+ $result += $oldmetadata[$index];
+ }
+ $result['expiry'] = ApiResult::formatExpiry( isset( $result['expiry'] ) ?
+ $result['expiry'] : null );
+
+ return $result;
+ }, array_keys( $params['4:array:oldgroups'] ) );
}
+
if ( isset( $params['5:array:newgroups'] ) ) {
$params['5:array:newgroups'] = $this->makeGroupArray( $params['5:array:newgroups'] );
+
+ $newmetadata =& $params['newmetadata'];
+ // unset old metadata entry to ensure metadata goes at the end of the params array
+ unset( $params['newmetadata'] );
+ $params['newmetadata'] = array_map( function ( $index ) use ( $params, $newmetadata ) {
+ $result = [ 'group' => $params['5:array:newgroups'][$index] ];
+ if ( isset( $newmetadata[$index] ) ) {
+ $result += $newmetadata[$index];
+ }
+ $result['expiry'] = ApiResult::formatExpiry( isset( $result['expiry'] ) ?
+ $result['expiry'] : null );
+
+ return $result;
+ }, array_keys( $params['5:array:newgroups'] ) );
}
return $params;
if ( isset( $ret['newgroups'] ) ) {
ApiResult::setIndexedTagName( $ret['newgroups'], 'g' );
}
+ if ( isset( $ret['oldmetadata'] ) ) {
+ ApiResult::setArrayType( $ret['oldmetadata'], 'array' );
+ ApiResult::setIndexedTagName( $ret['oldmetadata'], 'g' );
+ }
+ if ( isset( $ret['newmetadata'] ) ) {
+ ApiResult::setArrayType( $ret['newmetadata'], 'array' );
+ ApiResult::setIndexedTagName( $ret['newmetadata'], 'g' );
+ }
return $ret;
}