editgroup.php 10.2 KB
Newer Older
Evan Prodromou's avatar
Evan Prodromou committed
1 2
<?php
/**
3
 * StatusNet, the distributed open-source microblogging tool
Evan Prodromou's avatar
Evan Prodromou committed
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
 *
 * Edit an existing group
 *
 * PHP version 5
 *
 * LICENCE: 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/>.
 *
 * @category  Group
23
 * @package   StatusNet
24 25
 * @author    Evan Prodromou <evan@status.net>
 * @author    Sarven Capadisli <csarven@status.net>
26 27
 * @author    Zach Copley <zach@status.net>
 * @copyright 2008-2011 StatusNet, Inc.
Evan Prodromou's avatar
Evan Prodromou committed
28
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
29
 * @link      http://status.net/
Evan Prodromou's avatar
Evan Prodromou committed
30 31
 */

32
if (!defined('STATUSNET') && !defined('LACONICA')) {
Evan Prodromou's avatar
Evan Prodromou committed
33 34 35 36 37 38 39 40 41
    exit(1);
}

/**
 * Add a new group
 *
 * This is the form for adding a new group
 *
 * @category Group
42
 * @package  StatusNet
43 44
 * @author   Evan Prodromou <evan@status.net>
 * @author   Zach Copley <zach@status.net>
Evan Prodromou's avatar
Evan Prodromou committed
45
 * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
46
 * @link     http://status.net/
Evan Prodromou's avatar
Evan Prodromou committed
47
 */
48
class EditgroupAction extends GroupAction
Evan Prodromou's avatar
Evan Prodromou committed
49 50 51 52 53
{
    var $msg;

    function title()
    {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
54
        // TRANS: Title for form to edit a group. %s is a group nickname.
Evan Prodromou's avatar
Evan Prodromou committed
55 56 57 58 59 60 61
        return sprintf(_('Edit %s group'), $this->group->nickname);
    }

    /**
     * Prepare to run
     */

62
    protected function prepare(array $args=array())
Evan Prodromou's avatar
Evan Prodromou committed
63 64 65 66
    {
        parent::prepare($args);

        if (!common_logged_in()) {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
67
            // TRANS: Client error displayed trying to edit a group while not logged in.
Evan Prodromou's avatar
Evan Prodromou committed
68 69 70
            $this->clientError(_('You must be logged in to create a group.'));
        }

71
        $nickname_arg = $this->trimmed('nickname');
Evan Prodromou's avatar
Evan Prodromou committed
72 73 74 75 76 77 78 79 80 81
        $nickname = common_canonical_nickname($nickname_arg);

        // Permanent redirect on non-canonical nickname

        if ($nickname_arg != $nickname) {
            $args = array('nickname' => $nickname);
            common_redirect(common_local_url('editgroup', $args), 301);
        }

        if (!$nickname) {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
82
            // TRANS: Client error displayed trying to edit a group while not proving a nickname for the group to edit.
83
            $this->clientError(_('No nickname.'), 404);
Evan Prodromou's avatar
Evan Prodromou committed
84 85
        }

86
        $groupid = $this->trimmed('groupid');
87

88
        if ($groupid) {
89
            $this->group = User_group::getKV('id', $groupid);
90
        } else {
91
            $local = Local_group::getKV('nickname', $nickname);
92
            if ($local) {
93
                $this->group = User_group::getKV('id', $local->group_id);
94
            }
95
        }
Evan Prodromou's avatar
Evan Prodromou committed
96 97

        if (!$this->group) {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
98
            // TRANS: Client error displayed trying to edit a non-existing group.
99
            $this->clientError(_('No such group.'), 404);
Evan Prodromou's avatar
Evan Prodromou committed
100
        }
101

102 103
        $cur = common_current_user();

104
        if (!$cur->isAdmin($this->group)) {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
105
            // TRANS: Client error displayed trying to edit a group while not being a group admin.
106
            $this->clientError(_('You must be an admin to edit the group.'), 403);
107 108
        }

109
        return true;
Evan Prodromou's avatar
Evan Prodromou committed
110 111 112 113 114 115 116 117 118
    }

    /**
     * Handle the request
     *
     * On GET, show the form. On POST, try to save the group.
     *
     * @return void
     */
119
    protected function handle()
Evan Prodromou's avatar
Evan Prodromou committed
120
    {
121
        parent::handle();
Evan Prodromou's avatar
Evan Prodromou committed
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
            $this->trySave();
        } else {
            $this->showForm();
        }
    }

    function showForm($msg=null)
    {
        $this->msg = $msg;
        $this->showPage();
    }

    function showContent()
    {
        $form = new GroupEditForm($this, $this->group);
        $form->show();
    }

    function showPageNotice()
    {
        if ($this->msg) {
            $this->element('p', 'error', $this->msg);
        } else {
            $this->element('p', 'instructions',
Siebrand Mazeland's avatar
Siebrand Mazeland committed
147
                           // TRANS: Form instructions for group edit form.
Evan Prodromou's avatar
Evan Prodromou committed
148 149 150 151
                           _('Use this form to edit the group.'));
        }
    }

152 153 154
    function showScripts()
    {
        parent::showScripts();
155
        $this->autofocus('fullname');
156 157
    }

Evan Prodromou's avatar
Evan Prodromou committed
158 159
    function trySave()
    {
160 161
        $cur = common_current_user();
        if (!$cur->isAdmin($this->group)) {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
162
            // TRANS: Client error displayed trying to edit a group while not being a group admin.
163
            $this->clientError(_('You must be an admin to edit the group.'), 403);
164 165
        }

166
        if (Event::handle('StartGroupSaveForm', array($this))) {
Evan Prodromou's avatar
Evan Prodromou committed
167

168 169 170 171 172 173 174 175 176 177 178 179
            // $nickname will only be set if this changenick value is true.
            if (common_config('profile', 'changenick') == true) {
                try {
                    $nickname = Nickname::normalize($this->trimmed('newnickname'), true);
                } catch (NicknameTakenException $e) {
                    // Abort only if the nickname is occupied by _another_ group
                    if ($e->profile->id != $this->group->profile_id) {
                        $this->showForm($e->getMessage());
                        return;
                    }
                    $nickname = Nickname::normalize($this->trimmed('newnickname')); // without in-use check this time
                } catch (NicknameException $e) {
180 181 182 183 184
                    $this->showForm($e->getMessage());
                    return;
                }
            }

185 186 187 188 189
            $fullname    = $this->trimmed('fullname');
            $homepage    = $this->trimmed('homepage');
            $description = $this->trimmed('description');
            $location    = $this->trimmed('location');
            $aliasstring = $this->trimmed('aliases');
190 191 192 193 194 195 196 197 198
            $private     = $this->boolean('private');

            if ($private) {
                $force_scope = 1;
                $join_policy = User_group::JOIN_POLICY_MODERATE;
            } else {
                $force_scope = 0;
                $join_policy = User_group::JOIN_POLICY_OPEN;
            }
199

200
            if (!is_null($homepage) && (strlen($homepage) > 0) &&
201
                       !common_valid_http_url($homepage)) {
202 203 204 205
                // TRANS: Group edit form validation error.
                $this->showForm(_('Homepage is not a valid URL.'));
                return;
            } else if (!is_null($fullname) && mb_strlen($fullname) > 255) {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
206
                // TRANS: Group edit form validation error.
207 208 209 210 211 212 213 214 215 216 217 218 219
                $this->showForm(_('Full name is too long (maximum 255 characters).'));
                return;
            } else if (User_group::descriptionTooLong($description)) {
                $this->showForm(sprintf(
                                    // TRANS: Group edit form validation error.
                                    _m('Description is too long (maximum %d character).',
                                       'Description is too long (maximum %d characters).',
                                       User_group::maxDescription()),
                                    User_group::maxDescription()));
                return;
            } else if (!is_null($location) && mb_strlen($location) > 255) {
                // TRANS: Group edit form validation error.
                $this->showForm(_('Location is too long (maximum 255 characters).'));
220 221
                return;
            }
222 223

            if (!empty($aliasstring)) {
224 225
                $aliases = array_map(array('Nickname', 'normalize'),
                                     array_unique(preg_split('/[\s,]+/', $aliasstring)));
226 227 228 229 230
            } else {
                $aliases = array();
            }

            if (count($aliases) > common_config('group', 'maxaliases')) {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
231
                // TRANS: Group edit form validation error.
232 233 234 235 236
                // TRANS: %d is the maximum number of allowed aliases.
                $this->showForm(sprintf(_m('Too many aliases! Maximum %d allowed.',
                                           'Too many aliases! Maximum %d allowed.',
                                           common_config('group', 'maxaliases')),
                                        common_config('group', 'maxaliases')));
237 238 239
                return;
            }

240
            $this->group->query('BEGIN');
241

242
            $orig = clone($this->group);
Evan Prodromou's avatar
Evan Prodromou committed
243

244 245 246 247 248 249
            if (common_config('profile', 'changenick') == true && $this->group->nickname !== $nickname) {
                assert(Nickname::normalize($nickname)===$nickname);
                common_debug("Changing group nickname from '{$profile->nickname}' to '{$nickname}'.");
                $this->group->nickname = $nickname;
                $this->group->mainpage = common_local_url('showgroup', array('nickname' => $this->group->nickname));
            }
250 251 252 253
            $this->group->fullname    = $fullname;
            $this->group->homepage    = $homepage;
            $this->group->description = $description;
            $this->group->location    = $location;
254
            $this->group->join_policy = $join_policy;
255
            $this->group->force_scope = $force_scope;
Evan Prodromou's avatar
Evan Prodromou committed
256

257
            $result = $this->group->update($orig);
Evan Prodromou's avatar
Evan Prodromou committed
258

259
            if ($result === false) {
260 261 262 263
                common_log_db_error($this->group, 'UPDATE', __FILE__);
                // TRANS: Server error displayed when editing a group fails.
                $this->serverError(_('Could not update group.'));
            }
Evan Prodromou's avatar
Evan Prodromou committed
264

265
            $result = $this->group->setAliases($aliases);
266

267 268 269 270
            if (!$result) {
                // TRANS: Server error displayed when group aliases could not be added.
                $this->serverError(_('Could not create aliases.'));
            }
271

272 273 274 275
            $this->group->query('COMMIT');

            Event::handle('EndGroupSaveForm', array($this));
        }
276

Evan Prodromou's avatar
Evan Prodromou committed
277
        if ($this->group->nickname != $orig->nickname) {
278
            common_redirect(common_local_url('editgroup', array('nickname' => $this->group->nickname)), 303);
Evan Prodromou's avatar
Evan Prodromou committed
279
        } else {
Siebrand Mazeland's avatar
Siebrand Mazeland committed
280
            // TRANS: Group edit form success message.
Evan Prodromou's avatar
Evan Prodromou committed
281 282 283
            $this->showForm(_('Options saved.'));
        }
    }
284
}