+
+ /**
+ * Get a poll response based on a notice
+ *
+ * @param Notice $notice Notice to check for
+ *
+ * @return Poll_response found response or null
+ */
+ static function getByNotice($notice)
+ {
+ return self::getKV('uri', $notice->uri);
+ }
+
+ /**
+ * Get the notice that belongs to this response...
+ *
+ * @return Notice
+ */
+ function getNotice()
+ {
+ return Notice::getKV('uri', $this->uri);
+ }
+
+ function bestUrl()
+ {
+ return $this->getNotice()->bestUrl();
+ }
+
+ /**
+ *
+ * @return Poll
+ */
+ function getPoll()
+ {
+ return Poll::getKV('id', $this->poll_id);
+ }
+ /**
+ * Save a new poll notice
+ *
+ * @param Profile $profile
+ * @param Poll $poll the poll being responded to
+ * @param int $selection (1-based)
+ * @param array $opts (poll responses)
+ *
+ * @return Notice saved notice
+ */
+ static function saveNew($profile, $poll, $selection, $options=null)
+ {
+ if (empty($options)) {
+ $options = array();
+ }
+
+ if (!$poll->isValidSelection($selection)) {
+ // TRANS: Client exception thrown when responding to a poll with an invalid option.
+ throw new ClientException(_m('Invalid poll selection.'));
+ }
+ $opts = $poll->getOptions();
+ $answer = $opts[$selection - 1];
+
+ $pr = new Poll_response();
+ $pr->id = UUID::gen();
+ $pr->profile_id = $profile->id;
+ $pr->poll_id = $poll->id;
+ $pr->selection = $selection;
+
+ 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 {
+ $pr->uri = common_local_url('showpollresponse',
+ array('id' => $pr->id));
+ }
+
+ common_log(LOG_DEBUG, "Saving poll response: $pr->id $pr->uri");
+ $pr->insert();
+
+ // TRANS: Notice content voting for a poll.
+ // TRANS: %s is the chosen option in the poll.
+ $content = sprintf(_m('voted for "%s"'),
+ $answer);
+ $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);
+
+ $tags = array();
+
+ $options = array_merge(array('urls' => array(),
+ 'rendered' => $rendered,
+ 'tags' => $tags,
+ 'reply_to' => $poll->getNotice()->id,
+ 'object_type' => PollPlugin::POLL_RESPONSE_OBJECT),
+ $options);
+
+ if (!array_key_exists('uri', $options)) {
+ $options['uri'] = $pr->uri;
+ }
+
+ $saved = Notice::saveNew($profile->id,
+ $content,
+ array_key_exists('source', $options) ?
+ $options['source'] : 'web',
+ $options);
+
+ return $saved;
+ }