X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FUserFlag%2Fadminprofileflag.php;h=d9e57cfc4b1a247d3446b733e0f292e1fdf4ccff;hb=d594c83a5a9a9d42fce917b544c28591fcadb1aa;hp=5d6acf0863c4cb94ec28575e9afc735b30f95294;hpb=5d6b6bfd3494a7829c8fdccfdf85278811db83c8;p=quix0rs-gnu-social.git diff --git a/plugins/UserFlag/adminprofileflag.php b/plugins/UserFlag/adminprofileflag.php index 5d6acf0863..d9e57cfc4b 100644 --- a/plugins/UserFlag/adminprofileflag.php +++ b/plugins/UserFlag/adminprofileflag.php @@ -40,10 +40,10 @@ if (!defined('STATUSNET')) { * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 * @link http://status.net/ */ - class AdminprofileflagAction extends Action { - var $page = null; + var $page = null; + var $profiles = null; /** * Take arguments for running @@ -52,7 +52,6 @@ class AdminprofileflagAction extends Action * * @return boolean success flag */ - function prepare($args) { parent::prepare($args); @@ -62,7 +61,8 @@ class AdminprofileflagAction extends Action // User must be logged in. if (!common_logged_in()) { - $this->clientError(_('Not logged in.')); + // TRANS: Error message displayed when trying to perform an action that requires a logged in user. + $this->clientError(_m('Not logged in.')); return; } @@ -86,18 +86,19 @@ class AdminprofileflagAction extends Action // User must have the right to review flags if (!$user->hasRight(UserFlagPlugin::REVIEWFLAGS)) { - $this->clientError(_('You cannot review profile flags.')); + // TRANS: Error message displayed when trying to review profile flags while not authorised. + $this->clientError(_m('You cannot review profile flags.')); return false; } - $page = $this->int('page'); + $this->page = $this->trimmed('page'); - if (empty($page)) { + if (empty($this->page)) { $this->page = 1; - } else { - $this->page = $page; } + $this->profiles = $this->getProfiles(); + return true; } @@ -108,7 +109,6 @@ class AdminprofileflagAction extends Action * * @return void */ - function handle($args) { parent::handle($args); @@ -116,8 +116,15 @@ class AdminprofileflagAction extends Action $this->showPage(); } - function title() { - return _('Flagged profiles'); + /** + * Title of this page + * + * @return string Title of the page + */ + function title() + { + // TRANS: Title for page with a list of profiles that were flagged for review. + return _m('Flagged profiles'); } /** @@ -125,16 +132,21 @@ class AdminprofileflagAction extends Action * * @return void */ - function showContent() { - $profile = $this->getProfiles(); + $pl = new FlaggedProfileList($this->profiles, $this); - $pl = new FlaggedProfileList($profile, $this); + $cnt = $pl->show(); - $pl->show(); + $this->pagination($this->page > 1, $cnt > PROFILES_PER_PAGE, + $this->page, 'adminprofileflag'); } + /** + * Retrieve this action's profiles + * + * @return Profile $profile Profile query results + */ function getProfiles() { $ufp = new User_flag_profile(); @@ -146,7 +158,12 @@ class AdminprofileflagAction extends Action $ufp->whereAdd('cleared is NULL'); $ufp->groupBy('profile_id'); - $ufp->orderBy('flag_count DESC'); + $ufp->orderBy('flag_count DESC, profile_id DESC'); + + $offset = ($this->page-1) * PROFILES_PER_PAGE; + $limit = PROFILES_PER_PAGE + 1; + + $ufp->limit($offset, $limit); $profiles = array(); @@ -165,19 +182,53 @@ class AdminprofileflagAction extends Action } } -class FlaggedProfileList extends ProfileList { - +/** + * Specialization of ProfileList to show flagging information + * + * Most of the hard part is done in FlaggedProfileListItem. + * + * @category Widget + * @package StatusNet + * @author Evan Prodromou + * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 + * @link http://status.net/ + */ +class FlaggedProfileList extends ProfileList +{ + /** + * Factory method for creating new list items + * + * @param Profile $profile Profile to create an item for + * + * @return ProfileListItem newly-created item + */ function newListItem($profile) { return new FlaggedProfileListItem($this->profile, $this->action); } } +/** + * Specialization of ProfileListItem to show flagging information + * + * @category Widget + * @package StatusNet + * @author Evan Prodromou + * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 + * @link http://status.net/ + */ class FlaggedProfileListItem extends ProfileListItem { - var $user = null; + const MAX_FLAGGERS = 5; + + var $user = null; var $r2args = null; + /** + * Overload parent's action list with our own moderation-oriented buttons + * + * @return void + */ function showActions() { $this->user = common_current_user(); @@ -189,7 +240,8 @@ class FlaggedProfileListItem extends ProfileListItem $this->startActions(); if (Event::handle('StartProfileListItemActionElements', array($this))) { $this->out->elementStart('li', 'entity_moderation'); - $this->out->element('p', null, _('Moderate')); + // TRANS: Header for moderation menu with action buttons for flagged profiles (like 'sandbox', 'silence', ...). + $this->out->element('p', null, _m('Moderate')); $this->out->elementStart('ul'); $this->showSandboxButton(); $this->showSilenceButton(); @@ -202,6 +254,11 @@ class FlaggedProfileListItem extends ProfileListItem $this->endActions(); } + /** + * Show a button to sandbox the profile + * + * @return void + */ function showSandboxButton() { if ($this->user->hasRight(Right::SANDBOXUSER)) { @@ -217,6 +274,11 @@ class FlaggedProfileListItem extends ProfileListItem } } + /** + * Show a button to silence the profile + * + * @return void + */ function showSilenceButton() { if ($this->user->hasRight(Right::SILENCEUSER)) { @@ -232,6 +294,11 @@ class FlaggedProfileListItem extends ProfileListItem } } + /** + * Show a button to delete user and profile + * + * @return void + */ function showDeleteButton() { @@ -243,7 +310,93 @@ class FlaggedProfileListItem extends ProfileListItem } } + /** + * Show a button to clear flags + * + * @return void + */ function showClearButton() { + if ($this->user->hasRight(UserFlagPlugin::CLEARFLAGS)) { + $this->out->elementStart('li', 'entity_clear'); + $cf = new ClearFlagForm($this->out, $this->profile, $this->r2args); + $cf->show(); + $this->out->elementEnd('li'); + } + } + + /** + * Overload parent function to add flaggers list + * + * @return void + */ + function endProfile() + { + $this->showFlaggersList(); + parent::endProfile(); + } + + /** + * Show a list of people who've flagged this profile + * + * @return void + */ + function showFlaggersList() + { + $flaggers = array(); + + $ufp = new User_flag_profile(); + + $ufp->selectAdd(); + $ufp->selectAdd('user_id'); + $ufp->profile_id = $this->profile->id; + $ufp->orderBy('created'); + + if ($ufp->find()) { // XXX: this should always happen + while ($ufp->fetch()) { + $user = User::staticGet('id', $ufp->user_id); + if (!empty($user)) { // XXX: this would also be unusual + $flaggers[] = clone($user); + } + } + } + + $cnt = count($flaggers); + $others = 0; + + if ($cnt > self::MAX_FLAGGERS) { + $flaggers = array_slice($flaggers, 0, self::MAX_FLAGGERS); + $others = $cnt - self::MAX_FLAGGERS; + } + + $lnks = array(); + + foreach ($flaggers as $flagger) { + + $url = common_local_url('showstream', + array('nickname' => $flagger->nickname)); + + $lnks[] = XMLStringer::estring('a', array('href' => $url, + 'class' => 'flagger'), + $flagger->nickname); + } + + if ($cnt > 0) { + if ($others > 0) { + $flagging_users = implode(', ', $lnks); + // TRANS: Message displayed on a profile if it has been flagged. + // TRANS: %1$s is a comma separated list of at most 5 user nicknames that flagged. + // TRANS: %2$d is a positive integer of additional flagging users. Also used for plural. + $text .= sprintf(_m('Flagged by %1$s and %2$d other', 'Flagged by %1$s and %2$d others', $others), $flagging_users, $others); + } else { + // TRANS: Message displayed on a profile if it has been flagged. + // TRANS: %s is a comma separated list of at most 5 user nicknames that flagged. + $text .= sprintf(_m('Flagged by %s'), $flagging_users); + } + + $this->out->elementStart('p', array('class' => 'flaggers')); + $this->out->raw($text); + $this->out->elementEnd('p'); + } } }