X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Flogging%2FRightsLogFormatter.php;h=4b4d19f4fb0e1c4ea84e3290ada56c42aba43ece;hb=5c39992e395c314f08fb6ef83d6de7de09258faa;hp=be73c86495d79b1dc824c457a0be01eb6a71da5b;hpb=a465d1dbeb220610bf856228b88b72e6b756a700;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/logging/RightsLogFormatter.php b/includes/logging/RightsLogFormatter.php index be73c86495..4b4d19f4fb 100644 --- a/includes/logging/RightsLogFormatter.php +++ b/includes/logging/RightsLogFormatter.php @@ -70,7 +70,7 @@ class RightsLogFormatter extends LogFormatter { 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; } @@ -81,25 +81,29 @@ class RightsLogFormatter extends LogFormatter { $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(); } @@ -109,6 +113,42 @@ class RightsLogFormatter extends LogFormatter { 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(); @@ -126,12 +166,44 @@ class RightsLogFormatter extends LogFormatter { } } - // 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; @@ -145,6 +217,14 @@ class RightsLogFormatter extends LogFormatter { 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; }