| 
									
										
										
										
											2011-03-07 21:28:36 -08:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Data class to record responses to polls | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * PHP version 5 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category PollPlugin | 
					
						
							|  |  |  |  * @package  StatusNet | 
					
						
							|  |  |  |  * @author   Brion Vibber <brion@status.net> | 
					
						
							|  |  |  |  * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 | 
					
						
							|  |  |  |  * @link     http://status.net/ | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * StatusNet - the distributed open-source microblogging tool | 
					
						
							|  |  |  |  * Copyright (C) 2011, 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 <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (!defined('STATUSNET')) { | 
					
						
							|  |  |  |     exit(1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * For storing the poll options and such | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category PollPlugin | 
					
						
							|  |  |  |  * @package  StatusNet | 
					
						
							|  |  |  |  * @author   Brion Vibber <brion@status.net> | 
					
						
							|  |  |  |  * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 | 
					
						
							|  |  |  |  * @link     http://status.net/ | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @see      DB_DataObject | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | class Poll_response extends Managed_DataObject | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     public $__table = 'poll_response'; // table name
 | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  |     public $id;          // char(36) primary key not null -> UUID
 | 
					
						
							| 
									
										
										
										
											2015-02-12 18:18:55 +01:00
										 |  |  |     public $uri;         // varchar(191)   not 255 because utf8mb4 takes more space
 | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  |     public $poll_id;     // char(36) -> poll.id UUID
 | 
					
						
							| 
									
										
										
										
											2011-03-07 21:28:36 -08:00
										 |  |  |     public $profile_id;  // int -> profile.id
 | 
					
						
							|  |  |  |     public $selection;   // int -> choice #
 | 
					
						
							|  |  |  |     public $created;     // datetime
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * The One True Thingy that must be defined and declared. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public static function schemaDef() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return array( | 
					
						
							|  |  |  |             'description' => 'Record of responses to polls', | 
					
						
							|  |  |  |             'fields' => array( | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  |                 'id' => array('type' => 'char', 'length' => 36, 'not null' => true, 'description' => 'UUID of the response'), | 
					
						
							| 
									
										
										
										
											2015-02-12 18:18:55 +01:00
										 |  |  |                 'uri' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'UUID to the response notice'), | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  |                 'poll_id' => array('type' => 'char', 'length' => 36, 'not null' => true, 'description' => 'UUID of poll being responded to'), | 
					
						
							| 
									
										
										
										
											2011-03-07 21:28:36 -08:00
										 |  |  |                 'profile_id' => array('type' => 'int'), | 
					
						
							|  |  |  |                 'selection' => array('type' => 'int'), | 
					
						
							|  |  |  |                 'created' => array('type' => 'datetime', 'not null' => true), | 
					
						
							|  |  |  |             ), | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  |             'primary key' => array('id'), | 
					
						
							| 
									
										
										
										
											2011-03-07 21:28:36 -08:00
										 |  |  |             'unique keys' => array( | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  |                 'poll_uri_key' => array('uri'), | 
					
						
							| 
									
										
										
										
											2011-03-07 21:28:36 -08:00
										 |  |  |                 'poll_response_poll_id_profile_id_key' => array('poll_id', 'profile_id'), | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |             'indexes' => array( | 
					
						
							|  |  |  |                 'poll_response_profile_id_poll_id_index' => array('profile_id', 'poll_id'), | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Get a poll response based on a notice | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Notice $notice Notice to check for | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-06-23 00:55:40 +01:00
										 |  |  |      * @return get_called_class found response or null | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-06-23 00:55:40 +01:00
										 |  |  |     public static function getByNotice($notice) | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2013-08-18 13:04:58 +02:00
										 |  |  |         return self::getKV('uri', $notice->uri); | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Get the notice that belongs to this response... | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-06-23 00:55:40 +01:00
										 |  |  |      * @return get_called_class | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-06-23 00:55:40 +01:00
										 |  |  |     public function getNotice() | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2013-08-18 13:04:58 +02:00
										 |  |  |         return Notice::getKV('uri', $this->uri); | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 00:55:40 +01:00
										 |  |  |     public function getUrl() | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-04-29 19:46:58 +02:00
										 |  |  |         return $this->getNotice()->getUrl(); | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-10 13:55:47 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-06-23 00:55:40 +01:00
										 |  |  |      * @return get_called_class | 
					
						
							| 
									
										
										
										
											2011-03-10 13:55:47 -08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-06-23 00:55:40 +01:00
										 |  |  |     public function getPoll() | 
					
						
							| 
									
										
										
										
											2011-03-10 13:55:47 -08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2013-08-18 13:04:58 +02:00
										 |  |  |         return Poll::getKV('id', $this->poll_id); | 
					
						
							| 
									
										
										
										
											2011-03-10 13:55:47 -08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-06-23 00:55:40 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Save a new poll notice | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Profile $profile | 
					
						
							| 
									
										
										
										
											2019-06-23 00:55:40 +01:00
										 |  |  |      * @param Poll $poll the poll being responded to | 
					
						
							|  |  |  |      * @param int $selection (1-based) | 
					
						
							|  |  |  |      * @param null $options | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  |      * @return Notice saved notice | 
					
						
							| 
									
										
										
										
											2019-06-23 00:55:40 +01:00
										 |  |  |      * @throws ClientException | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-06-23 00:55:40 +01:00
										 |  |  |     public static function saveNew($profile, $poll, $selection, $options = null) | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  |     { | 
					
						
							|  |  |  |         if (empty($options)) { | 
					
						
							| 
									
										
										
										
											2019-06-23 00:55:40 +01:00
										 |  |  |             $options = []; | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-10 13:41:23 -08:00
										 |  |  |         if (!$poll->isValidSelection($selection)) { | 
					
						
							| 
									
										
										
										
											2011-03-11 19:05:28 +01:00
										 |  |  |             // TRANS: Client exception thrown when responding to a poll with an invalid option.
 | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  |             throw new ClientException(_m('Invalid poll selection.')); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2011-03-10 13:41:23 -08:00
										 |  |  |         $opts = $poll->getOptions(); | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  |         $answer = $opts[$selection - 1]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $pr = new Poll_response(); | 
					
						
							| 
									
										
										
										
											2019-06-23 00:55:40 +01:00
										 |  |  |         $pr->id = UUID::gen(); | 
					
						
							|  |  |  |         $pr->profile_id = $profile->id; | 
					
						
							|  |  |  |         $pr->poll_id = $poll->id; | 
					
						
							|  |  |  |         $pr->selection = $selection; | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (array_key_exists('created', $options)) { | 
					
						
							|  |  |  |             $pr->created = $options['created']; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             $pr->created = common_sql_now(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (array_key_exists('uri', $options)) { | 
					
						
							|  |  |  |             $pr->uri = $options['uri']; | 
					
						
							|  |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2019-06-23 00:55:40 +01:00
										 |  |  |             $pr->uri = common_local_url( | 
					
						
							|  |  |  |                 'showpollresponse', | 
					
						
							|  |  |  |                 array('id' => $pr->id) | 
					
						
							|  |  |  |             ); | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         common_log(LOG_DEBUG, "Saving poll response: $pr->id $pr->uri"); | 
					
						
							|  |  |  |         $pr->insert(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-11 19:05:28 +01:00
										 |  |  |         // TRANS: Notice content voting for a poll.
 | 
					
						
							|  |  |  |         // TRANS: %s is the chosen option in the poll.
 | 
					
						
							| 
									
										
										
										
											2019-06-23 00:55:40 +01:00
										 |  |  |         $content = sprintf( | 
					
						
							|  |  |  |             _m('voted for "%s"'), | 
					
						
							|  |  |  |             $answer | 
					
						
							|  |  |  |         ); | 
					
						
							| 
									
										
										
										
											2011-03-11 19:05:28 +01:00
										 |  |  |         $link = '<a href="' . htmlspecialchars($poll->uri) . '">' . htmlspecialchars($answer) . '</a>'; | 
					
						
							|  |  |  |         // TRANS: Rendered version of the notice content voting for a poll.
 | 
					
						
							|  |  |  |         // TRANS: %s a link to the poll with the chosen option as link description.
 | 
					
						
							|  |  |  |         $rendered = sprintf(_m('voted for "%s"'), $link); | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 00:55:40 +01:00
										 |  |  |         $tags = array(); | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 00:55:40 +01:00
										 |  |  |         $options = array_merge( | 
					
						
							|  |  |  |             array('urls' => array(), | 
					
						
							|  |  |  |                 'rendered' => $rendered, | 
					
						
							|  |  |  |                 'tags' => $tags, | 
					
						
							|  |  |  |                 'reply_to' => $poll->getNotice()->id, | 
					
						
							|  |  |  |                 'object_type' => PollPlugin::POLL_RESPONSE_OBJECT), | 
					
						
							|  |  |  |             $options | 
					
						
							|  |  |  |         ); | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (!array_key_exists('uri', $options)) { | 
					
						
							|  |  |  |             $options['uri'] = $pr->uri; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 00:55:40 +01:00
										 |  |  |         $saved = Notice::saveNew( | 
					
						
							|  |  |  |             $profile->id, | 
					
						
							|  |  |  |             $content, | 
					
						
							|  |  |  |             array_key_exists('source', $options) ? | 
					
						
							|  |  |  |                 $options['source'] : 'web', | 
					
						
							|  |  |  |             $options | 
					
						
							|  |  |  |         ); | 
					
						
							| 
									
										
										
										
											2011-03-10 12:38:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return $saved; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-03-07 21:28:36 -08:00
										 |  |  | } |