From 5db1479a9526fbb264d1d51647e925355ed6f062 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 7 Feb 2011 11:24:00 -0500 Subject: [PATCH] Form for posting a group message on group inbox --- plugins/PrivateGroup/Group_message.php | 43 +---- .../PrivateGroup/Group_privacy_settings.php | 47 +++++ plugins/PrivateGroup/PrivateGroupPlugin.php | 6 + plugins/PrivateGroup/groupinbox.php | 6 + plugins/PrivateGroup/groupmessageform.php | 166 ++++++++++++++++++ plugins/PrivateGroup/newgroupmessage.php | 155 ++++++++++++++++ 6 files changed, 382 insertions(+), 41 deletions(-) create mode 100644 plugins/PrivateGroup/groupmessageform.php create mode 100644 plugins/PrivateGroup/newgroupmessage.php diff --git a/plugins/PrivateGroup/Group_message.php b/plugins/PrivateGroup/Group_message.php index 21147b4629..07d4c57c08 100644 --- a/plugins/PrivateGroup/Group_message.php +++ b/plugins/PrivateGroup/Group_message.php @@ -127,48 +127,8 @@ class Group_message extends Memcached_DataObject $user->nickname)); } - $gps = Group_privacy_settings::staticGet('group_id', $group->id); + Group_privacy_settings::ensurePost($user, $group); - if (empty($gps)) { - // make a fake one with defaults - $gps = new Group_privacy_settings(); - $gps->allow_privacy = Group_privacy_settings::SOMETIMES; - $gps->allow_sender = Group_privacy_settings::MEMBER; - } - - if ($gps->allow_privacy == Group_privacy_settings::NEVER) { - throw new Exception(sprintf(_('Group %s does not allow private messages.'), - $group->nickname)); - } - - switch ($gps->allow_sender) { - case Group_privacy_settings::EVERYONE: - $profile = $user->getProfile(); - if (Group_block::isBlocked($group, $profile)) { - throw new Exception(sprintf(_('User %s is blocked from group %s.'), - $user->nickname, - $group->nickname)); - } - break; - case Group_privacy_settings::MEMBER: - if (!$user->isMember($group)) { - throw new Exception(sprintf(_('User %s is not a member of group %s.'), - $user->nickname, - $group->nickname)); - } - break; - case Group_privacy_settings::ADMIN: - if (!$user->isAdmin($group)) { - throw new Exception(sprintf(_('User %s is not an administrator of group %s.'), - $user->nickname, - $group->nickname)); - } - break; - default: - throw new Exception(sprintf(_('Unknown privacy settings for group %s.'), - $group->nickname)); - } - $text = $user->shortenLinks($text); // We use the same limits as for 'regular' private messages. @@ -244,4 +204,5 @@ class Group_message extends Memcached_DataObject return $gm; } + } diff --git a/plugins/PrivateGroup/Group_privacy_settings.php b/plugins/PrivateGroup/Group_privacy_settings.php index 7861571222..898ac266ce 100644 --- a/plugins/PrivateGroup/Group_privacy_settings.php +++ b/plugins/PrivateGroup/Group_privacy_settings.php @@ -144,4 +144,51 @@ class Group_privacy_settings extends Memcached_DataObject { return array(false, false, false); } + + function ensurePost($user, $group) + { + $gps = Group_privacy_settings::staticGet('group_id', $group->id); + + if (empty($gps)) { + // make a fake one with defaults + $gps = new Group_privacy_settings(); + $gps->allow_privacy = Group_privacy_settings::SOMETIMES; + $gps->allow_sender = Group_privacy_settings::MEMBER; + } + + if ($gps->allow_privacy == Group_privacy_settings::NEVER) { + throw new Exception(sprintf(_('Group %s does not allow private messages.'), + $group->nickname)); + } + + switch ($gps->allow_sender) { + case Group_privacy_settings::EVERYONE: + $profile = $user->getProfile(); + if (Group_block::isBlocked($group, $profile)) { + throw new Exception(sprintf(_('User %s is blocked from group %s.'), + $user->nickname, + $group->nickname)); + } + break; + case Group_privacy_settings::MEMBER: + if (!$user->isMember($group)) { + throw new Exception(sprintf(_('User %s is not a member of group %s.'), + $user->nickname, + $group->nickname)); + } + break; + case Group_privacy_settings::ADMIN: + if (!$user->isAdmin($group)) { + throw new Exception(sprintf(_('User %s is not an administrator of group %s.'), + $user->nickname, + $group->nickname)); + } + break; + default: + throw new Exception(sprintf(_('Unknown privacy settings for group %s.'), + $group->nickname)); + } + + return true; + } } diff --git a/plugins/PrivateGroup/PrivateGroupPlugin.php b/plugins/PrivateGroup/PrivateGroupPlugin.php index 39e788074c..001f085c0d 100644 --- a/plugins/PrivateGroup/PrivateGroupPlugin.php +++ b/plugins/PrivateGroup/PrivateGroupPlugin.php @@ -145,6 +145,7 @@ class PrivateGroupPlugin extends Plugin { case 'GroupinboxAction': case 'ShowgroupmessageAction': + case 'NewgroupmessageAction': include_once $dir . '/' . strtolower(mb_substr($cls, 0, -6)) . '.php'; return false; case 'Group_privacy_settings': @@ -155,6 +156,7 @@ class PrivateGroupPlugin extends Plugin case 'GroupMessageCommand': case 'GroupMessageList': case 'GroupMessageListItem': + case 'GroupMessageForm': include_once $dir . '/'.strtolower($cls).'.php'; return false; default: @@ -180,6 +182,10 @@ class PrivateGroupPlugin extends Plugin array('action' => 'showgroupmessage'), array('id' => '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}')); + $m->connect('group/:nickname/message/new', + array('action' => 'newgroupmessage'), + array('nickname' => Nickname::DISPLAY_FMT)); + return true; } diff --git a/plugins/PrivateGroup/groupinbox.php b/plugins/PrivateGroup/groupinbox.php index 419053151c..55bf4b0ee2 100644 --- a/plugins/PrivateGroup/groupinbox.php +++ b/plugins/PrivateGroup/groupinbox.php @@ -110,6 +110,12 @@ class GroupinboxAction extends GroupDesignAction $nav->show(); } + function showNoticeForm() + { + $form = new GroupMessageForm($this, $this->group); + $form->show(); + } + function showContent() { $gml = new GroupMessageList($this, $this->gm); diff --git a/plugins/PrivateGroup/groupmessageform.php b/plugins/PrivateGroup/groupmessageform.php new file mode 100644 index 0000000000..4564a60761 --- /dev/null +++ b/plugins/PrivateGroup/groupmessageform.php @@ -0,0 +1,166 @@ +. + * + * @category PrivateGroup + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + // This check helps protect against security problems; + // your code file can't be executed directly from the web. + exit(1); +} + +/** + * Form for posting a group message + * + * @category PrivateGroup + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +class GroupMessageForm extends Form +{ + var $group; + var $content; + + /** + * Constructor + * + * @param HTMLOutputter $out Output context + * @param User_group $group Group to post to + * + * @todo add a drop-down list to post to any group + */ + + function __construct($out, $group, $content=null) + { + parent::__construct($out); + + $this->group = $group; + $this->content = $content; + } + + /** + * Action for the form + */ + function action() + { + return common_local_url('newgroupmessage', + array('nickname' => $this->group->nickname)); + } + + /** + * Legend for the form + * + * @param + * + * @return + */ + function formLegend() + { + $this->out->element('legend', + null, + sprintf(_('Message to %s'), $this->group->nickname)); + } + + /** + * id for the form + * + * @param + * + * @return + */ + + function id() + { + return 'form_notice-group-message'; + } + + /** + * class for the form + * + * @param + * + * @return + */ + + function formClass() + { + return 'form_notice'; + } + + /** + * Entry data + * + * @param + * + * @return + */ + + function formData() + { + $this->out->element('label', array('for' => 'notice_data-text', + 'id' => 'notice_data-text-label'), + sprintf(_('Direct message to %s'), $this->group->nickname)); + + $this->out->element('textarea', array('id' => 'notice_data-text', + 'cols' => 35, + 'rows' => 4, + 'name' => 'content'), + ($this->content) ? $this->content : ''); + + $contentLimit = Message::maxContent(); + + if ($contentLimit > 0) { + $this->out->elementStart('dl', 'form_note'); + $this->out->element('dt', null, _('Available characters')); + $this->out->element('dd', array('id' => 'notice_text-count'), + $contentLimit); + $this->out->elementEnd('dl'); + } + } + + /** + * Legend for the form + * + * @param + * + * @return + */ + + function formActions() + { + $this->out->element('input', array('id' => 'notice_action-submit', + 'class' => 'submit', + 'name' => 'message_send', + 'type' => 'submit', + 'value' => _m('Send button for sending notice', 'Send'))); + } +} diff --git a/plugins/PrivateGroup/newgroupmessage.php b/plugins/PrivateGroup/newgroupmessage.php new file mode 100644 index 0000000000..c2755596b5 --- /dev/null +++ b/plugins/PrivateGroup/newgroupmessage.php @@ -0,0 +1,155 @@ +. + * + * @category Cache + * @package StatusNet + * @author Evan Prodromou + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + // This check helps protect against security problems; + // your code file can't be executed directly from the web. + exit(1); +} + +/** + * Action for adding a new group message + * + * @category Action + * @package StatusNet + * @author Evan Prodromou + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +class NewgroupmessageAction extends Action +{ + var $group; + var $user; + var $text; + + /** + * For initializing members of the class. + * + * @param array $argarray misc. arguments + * + * @return boolean true + */ + + function prepare($argarray) + { + parent::prepare($argarray); + + $this->user = common_current_user(); + + if (empty($this->user)) { + throw new ClientException(_('Must be logged in.'), 403); + } + + if (!$this->user->hasRight(Right::NEWMESSAGE)) { + throw new Exception(sprintf(_('User %s not allowed to send private messages.'), + $this->user->nickname)); + } + + $nicknameArg = $this->trimmed('nickname'); + + $nickname = common_canonical_nickname($nicknameArg); + + if ($nickname != $nicknameArg) { + $url = common_local_url('newgroupmessage', array('nickname' => $nickname)); + common_redirect($url, 301); + return false; + } + + $localGroup = Local_group::staticGet('nickname', $nickname); + + if (empty($localGroup)) { + throw new ClientException(_('No such group'), 404); + } + + $this->group = User_group::staticGet('id', $localGroup->group_id); + + if (empty($this->group)) { + throw new ClientException(_('No such group'), 404); + } + + // This throws an exception on error + + Group_privacy_settings::ensurePost($this->user, $this->group); + + // If we're posted to, check session token and get text + + if ($this->isPost()) { + $this->checkSessionToken(); + $this->text = $this->trimmed('content'); + } + + return true; + } + + /** + * Handler method + * + * @param array $argarray is ignored since it's now passed in in prepare() + * + * @return void + */ + + function handle($argarray=null) + { + if ($this->isPost()) { + $this->sendNewMessage(); + } else { + $this->showPage(); + } + } + + function sendNewMessage() + { + $gm = Group_message::send($this->user, $this->group, $this->text); + + if ($this->boolean('ajax')) { + $this->startHTML('text/xml;charset=utf-8'); + $this->elementStart('head'); + $this->element('title', null, _('Message sent')); + $this->elementEnd('head'); + $this->elementStart('body'); + $this->element('p', + array('id' => 'command_result'), + sprintf(_('Direct message to %s sent.'), + $this->group->nickname)); + $this->elementEnd('body'); + $this->elementEnd('html'); + } else { + common_redirect($gm->url, 303); + } + } + + function title() + { + return sprintf(_('New message to group %s'), $this->group->nickname); + } +} -- 2.39.5