From 35499a9952b04f17fc34f3f0dca7170d671b743b Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Tue, 6 Nov 2012 10:24:05 -0500 Subject: [PATCH] Add a flag to not deliver poll responses to home timeline Some people really hate getting poll responses in their home timeline, so there's now a flag to disable that. --- plugins/Poll/PollPlugin.php | 45 +++++++ plugins/Poll/User_poll_prefs.php | 85 +++++++++++++ plugins/Poll/pollsettings.php | 198 +++++++++++++++++++++++++++++++ 3 files changed, 328 insertions(+) create mode 100644 plugins/Poll/User_poll_prefs.php create mode 100644 plugins/Poll/pollsettings.php diff --git a/plugins/Poll/PollPlugin.php b/plugins/Poll/PollPlugin.php index 1246f6c2f8..1fadcf108c 100644 --- a/plugins/Poll/PollPlugin.php +++ b/plugins/Poll/PollPlugin.php @@ -64,6 +64,7 @@ class PollPlugin extends MicroAppPlugin $schema = Schema::get(); $schema->ensureTable('poll', Poll::schemaDef()); $schema->ensureTable('poll_response', Poll_response::schemaDef()); + $schema->ensureTable('user_poll_prefs', User_poll_prefs::schemaDef()); return true; } @@ -96,10 +97,12 @@ class PollPlugin extends MicroAppPlugin case 'ShowpollAction': case 'NewpollAction': case 'RespondpollAction': + case 'PollsettingsAction': include_once $dir . '/' . strtolower(mb_substr($cls, 0, -6)) . '.php'; return false; case 'Poll': case 'Poll_response': + case 'User_poll_prefs': include_once $dir.'/'.$cls.'.php'; return false; case 'NewPollForm': @@ -136,6 +139,9 @@ class PollPlugin extends MicroAppPlugin array('action' => 'respondpoll'), array('id' => '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}')); + $m->connect('settings/poll', + array('action' => 'pollsettings')); + return true; } @@ -491,4 +497,43 @@ class PollPlugin extends MicroAppPlugin } return true; } + + // Hide poll responses for @chuck + + function onEndNoticeWhoGets($notice, &$ni) { + if ($notice->object_type == self::POLL_RESPONSE_OBJECT) { + foreach ($ni as $id => $source) { + $user = User::staticGet('id', $id); + if (!empty($user)) { + $pollPrefs = User_poll_prefs::staticGet('user_id', $user->id); + if (!empty($pollPrefs) && ($pollPrefs->hide_responses)) { + unset($ni[$id]); + } + } + } + } + return true; + } + + /** + * Menu item for personal subscriptions/groups area + * + * @param Action $action action being executed + * + * @return boolean hook return + */ + + function onEndAccountSettingsNav($action) + { + $action_name = $action->trimmed('action'); + + $action->menuItem(common_local_url('pollsettings'), + // TRANS: Poll plugin menu item on user settings page. + _m('MENU', 'Polls'), + // TRANS: Poll plugin tooltip for user settings menu item. + _m('Configure poll behavior'), + $action_name === 'pollsettings'); + + return true; + } } diff --git a/plugins/Poll/User_poll_prefs.php b/plugins/Poll/User_poll_prefs.php new file mode 100644 index 0000000000..338e811948 --- /dev/null +++ b/plugins/Poll/User_poll_prefs.php @@ -0,0 +1,85 @@ + + * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 + * @link http://status.net/ + * + * StatusNet - the distributed open-source microblogging tool + * Copyright (C) 2012, StatusNet, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +/** + * For storing the poll prefs + * + * @category PollPlugin + * @package StatusNet + * @author Brion Vibber + * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 + * @link http://status.net/ + * + * @see DB_DataObject + */ +class User_poll_prefs extends Managed_DataObject +{ + public $__table = 'user_poll_prefs'; // table name + public $user_id; // int id + public $hide_responses; // boolean + public $created; // datetime + public $modified; // datetime + + /** + * Get an instance by key + * + * This is a utility method to get a single instance with a given key value. + * + * @param string $k Key to use to lookup (usually 'user_id' for this class) + * @param mixed $v Value to lookup + * + * @return User_greeting_count object found, or null for no hits + * + */ + function staticGet($k, $v=null) + { + return Memcached_DataObject::staticGet('User_poll_prefs', $k, $v); + } + + /** + * The One True Thingy that must be defined and declared. + */ + public static function schemaDef() + { + return array( + 'description' => 'Record of user preferences for polls', + 'fields' => array( + 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user id'), + 'hide_responses' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'Hide all poll responses'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('user_id') + ); + } +} diff --git a/plugins/Poll/pollsettings.php b/plugins/Poll/pollsettings.php new file mode 100644 index 0000000000..c3128895cf --- /dev/null +++ b/plugins/Poll/pollsettings.php @@ -0,0 +1,198 @@ +. + * + * @category Plugins + * @package StatusNet + * @author Brion Vibber + * @copyright 2012 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { + exit(1); +} + +class PollSettingsAction extends SettingsAction +{ + /** + * Title of the page + * + * @return string Page title + */ + function title() + { + // TRANS: Page title. + return _m('Poll settings'); + } + + /** + * Instructions for use + * + * @return string Instructions for use + */ + + function getInstructions() + { + // TRANS: Page instructions. + return _m('Set your poll preferences'); + } + + /** + * Show the form for Poll + * + * @return void + */ + function showContent() + { + $user = common_current_user(); + + $prefs = User_poll_prefs::staticGet('user_id', $user->id); + + $form = new PollPrefsForm($this, $prefs); + + $form->show(); + } + + /** + * Handler method + * + * @param array $argarray is ignored since it's now passed in in prepare() + * + * @return void + */ + + function handlePost() + { + $user = common_current_user(); + + $upp = User_poll_prefs::staticGet('user_id', $user->id); + $orig = null; + + if (!empty($upp)) { + $orig = clone($upp); + } else { + $upp = new User_poll_prefs(); + $upp->user_id = $user->id; + $upp->created = common_sql_now(); + } + + $upp->hide_responses = $this->boolean('hide_responses'); + $upp->modified = common_sql_now(); + + if (!empty($orig)) { + $upp->update($orig); + } else { + $upp->insert(); + } + + // TRANS: Confirmation shown when user profile settings are saved. + $this->showForm(_('Settings saved.'), true); + + return; + } +} + +class PollPrefsForm extends Form +{ + var $prefs; + + function __construct($out, $prefs) + { + parent::__construct($out); + $this->prefs = $prefs; + } + + /** + * Visible or invisible data elements + * + * Display the form fields that make up the data of the form. + * Sub-classes should overload this to show their data. + * + * @return void + */ + + function formData() + { + $this->elementStart('fieldset'); + $this->elementStart('ul', 'form_data'); + $this->elementStart('li'); + $this->checkbox('hide_responses', + _('Do not deliver poll responses to my home timeline'), + (!empty($this->prefs) && $this->prefs->hide_responses)); + $this->elementEnd('li'); + $this->elementEnd('ul'); + $this->elementEnd('fieldset'); + } + + /** + * Buttons for form actions + * + * Submit and cancel buttons (or whatever) + * Sub-classes should overload this to show their own buttons. + * + * @return void + */ + + function formActions() + { + $this->submit('submit', _('Save')); + } + + /** + * ID of the form + * + * Should be unique on the page. Sub-classes should overload this + * to show their own IDs. + * + * @return int ID of the form + */ + + function id() + { + return 'form_poll_prefs'; + } + + /** + * Action of the form. + * + * URL to post to. Should be overloaded by subclasses to give + * somewhere to post to. + * + * @return string URL to post to + */ + + function action() + { + return common_local_url('pollsettings'); + } + + /** + * Class of the form. May include space-separated list of multiple classes. + * + * @return string the form's class + */ + + function formClass() + { + return 'form_settings'; + } +}