edit.php 12.5 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
/**
 * This program is part of Mahara
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 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 General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
 *
 * @package    mahara
 * @subpackage admin
 * @author     Richard Mansfield <richard.mansfield@catalyst.net.nz>
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL
 * @copyright  (C) 2006,2007 Catalyst IT Ltd http://catalyst.net.nz
 *
 */

define('INTERNAL', 1);
28
define('INSTITUTIONALADMIN', 1);
29
require(dirname(dirname(dirname(__FILE__))) . '/init.php');
30
define('TITLE', get_string('accountsettings', 'admin'));
31
32
33
34
35
define('SECTION_PLUGINTYPE', 'core');
define('SECTION_PLUGINNAME', 'admin');
require_once('pieforms/pieform.php');

$id = param_integer('id');
36
37
$user = new User;
$user->find_by_id($id);
38

39
40
global $USER;
if (!$USER->get('admin')) {
41
42
43
44
45
46
    // Institutional admins must share an institution with the displayed user
    $shared = false;
    foreach ($user->get('institutions') as $i) {
        $shared = $shared || $USER->is_institutional_admin($i->institution);
    }
    if (!$shared) {
47
48
49
        redirect(get_config('wwwroot').'user/view.php?id='.$id);
    }
}
50

51
52
$suspended = $user->get('suspendedcusr');
if (empty($suspended)) {
53
    $suspendform = pieform(array(
Richard Mansfield's avatar
Richard Mansfield committed
54
        'name'       => 'edituser_suspend',
55
56
57
58
59
60
61
62
        'plugintype' => 'core',
        'pluginname' => 'admin',
        'elements'   => array(
            'id' => array(
                 'type'    => 'hidden',
                 'value'   => $id,
            ),
            'reason' => array(
63
64
65
                'type'        => 'textarea',
                'rows'        => 5,
                'cols'        => 60,
66
67
68
69
70
71
72
73
74
75
                'title'       => get_string('reason'),
            ),
            'submit' => array(
                'type'  => 'submit',
                'value' => get_string('suspenduser','admin'),
            ),
        )
    ));
} else {
    $suspendform = pieform(array(
Richard Mansfield's avatar
Richard Mansfield committed
76
        'name'       => 'edituser_unsuspend',
77
78
79
80
81
82
83
84
85
86
87
88
89
        'plugintype' => 'core',
        'pluginname' => 'admin',
        'elements'   => array(
            'id' => array(
                 'type'    => 'hidden',
                 'value'   => $id,
            ),
            'submit' => array(
                'type'  => 'submit',
                'value' => get_string('unsuspenduser','admin'),
            ),
        )
    ));
90
    $suspender = display_name(get_record('usr', 'id', $suspended));
91
92
}

Richard Mansfield's avatar
Richard Mansfield committed
93
function edituser_suspend_submit(Pieform $form, $values) {
94
95
96
97
98
99
    global $SESSION;
    suspend_user($values['id'], $values['reason']);
    $SESSION->add_ok_msg(get_string('usersuspended', 'admin'));
    redirect('/admin/users/edit.php?id=' . $values['id']);
}

Richard Mansfield's avatar
Richard Mansfield committed
100
function edituser_unsuspend_submit(Pieform $form, $values) {
101
102
103
104
105
106
107
108
    global $SESSION;
    unsuspend_user($values['id']);
    $SESSION->add_ok_msg(get_string('userunsuspended', 'admin'));
    redirect('/admin/users/edit.php?id=' . $values['id']);
}


// Site-wide account settings
Richard Mansfield's avatar
Richard Mansfield committed
109
$elements = array();
110
111
112
113
114
115
116
117
118
119
120
121
122
123
$elements['id'] = array(
    'type'    => 'hidden',
    'rules'   => array('integer' => true),
    'value'   => $id,
);
$elements['password'] = array(
    'type'         => 'text',
    'title'        => get_string('resetpassword','admin'),
);
$elements['passwordchange'] = array(
    'type'         => 'checkbox',
    'title'        => get_string('forcepasswordchange','admin'),
    'defaultvalue' => $user->passwordchange,
);
124
125
126
127
128
129
130
131
132
133
134
135
if ($USER->get('admin')) {
    $elements['staff'] = array(
        'type'         => 'checkbox',
        'title'        => get_string('sitestaff','admin'),
        'defaultvalue' => $user->staff,
    );
    $elements['admin'] = array(
        'type'         => 'checkbox',
        'title'        => get_string('siteadmin','admin'),
        'defaultvalue' => $user->admin,
    );
}
136
$elements['quota'] = array(
137
    'type'         => 'bytes',
138
    'title'        => get_string('filequota','admin'),
139
    'defaultvalue' => $user->quota,
140
);
141
142
143
144
145
146

$authinstances = auth_get_auth_instances();
if (count($authinstances) > 1) {
    $options = array();

    foreach ($authinstances as $authinstance) {
Richard Mansfield's avatar
Richard Mansfield committed
147
        if ($USER->can_edit_institution($authinstance->name)) {
148
149
            $options[$authinstance->id] = $authinstance->displayname. ': '.$authinstance->instancename;
        }
150
151
    }

152
153
154
155
156
157
158
159
    if (isset($options[$user->authinstance])) {
        $elements['authinstance'] = array(
            'type' => 'select',
            'title' => get_string('authenticatedby', 'admin'),
            'options' => $options,
            'defaultvalue' => $user->authinstance,
        );
    }
160
161
}

162
163
164
165
166
$elements['submit'] = array(
    'type'  => 'submit',
    'value' => get_string('savechanges','admin'),
);

Richard Mansfield's avatar
Richard Mansfield committed
167
168
$siteform = pieform(array(
    'name'       => 'edituser_site',
169
170
171
172
173
174
175
    'renderer'   => 'table',
    'plugintype' => 'core',
    'pluginname' => 'admin',
    'elements'   => $elements,
));


Richard Mansfield's avatar
Richard Mansfield committed
176
function edituser_site_submit(Pieform $form, $values) {
177
178
179
180
181
182
183
184
    if (!$user = get_record('usr', 'id', $values['id'])) {
        return false;
    }

    if (isset($values['password']) && $values['password'] !== '') {
        $user->password = $values['password'];
    }
    $user->passwordchange = (int) ($values['passwordchange'] == 'on');
185
    $user->quota = $values['quota'];
186
187
188
189
190
191
192
193
194
195
196
197
198

    global $USER;
    if ($USER->get('admin')) {  // Not editable by institutional admins
        $user->staff = (int) ($values['staff'] == 'on');
        $user->admin = (int) ($values['admin'] == 'on');
    }

    // Authinstance can be changed by institutional admins if both the
    // old and new authinstances belong to the admin's institutions
    if (isset($values['authinstance']) &&
        ($USER->get('admin') || 
         ($USER->is_institutional_admin(get_field('auth_instance', 'institution', 'id', $values['authinstance'])) &&
          $USER->is_institutional_admin(get_field('auth_instance', 'institution', 'id', $user->authinstance))))) {
199
200
        $user->authinstance = $values['authinstance'];
    }
201
202
203
204
205
206
207

    update_record('usr', $user);

    redirect('/admin/users/edit.php?id='.$user->id);
}


208
// Institution settings form
Richard Mansfield's avatar
Richard Mansfield committed
209
210
211
212
213
214
215
216

$elements = array(
    'id' => array(
         'type'    => 'hidden',
         'value'   => $id,
     ),
);

217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
$allinstitutions = get_records_assoc('institution');
$currentdate = getdate();
foreach ($user->get('institutions') as $i) {
    $elements[$i->institution.'_settings'] = array(
        'type' => 'fieldset',
        'legend' => $allinstitutions[$i->institution]->displayname,
        'elements' => array(
            $i->institution.'_expiry' => array(
                'type'         => 'date',
                'title'        => get_string('membershipexpiry'),
                'minyear'      => $currentdate['year'],
                'maxyear'      => $currentdate['year'] + 20,
                'defaultvalue' => $i->expiry
            ),
            $i->institution.'_studentid' => array(
                'type'         => 'text',
                'title'        => get_string('studentid'),
                'defaultvalue' => $i->studentid,
            ),
            $i->institution.'_staff' => array(
                'type'         => 'checkbox',
                'title'        => get_string('institutionstaff','admin'),
                'defaultvalue' => $i->staff,
            ),
            $i->institution.'_admin' => array(
                'type'         => 'checkbox',
                'title'        => get_string('institutionadmin','admin'),
                'defaultvalue' => $i->admin,
            ),
            $i->institution.'_submit' => array(
                'type'  => 'submit',
                'value' => get_string('update'),
            ),
        ),
Richard Mansfield's avatar
Richard Mansfield committed
251
    );
252
    $elements[$i->institution.'_remove'] = array(
Richard Mansfield's avatar
Richard Mansfield committed
253
        'type'  => 'submit',
254
        'value' => get_string('remove'),
Richard Mansfield's avatar
Richard Mansfield committed
255
256
    );
}
257

258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
// Only site admins can add institutions; institutional admins must invite
if ($USER->get('admin') 
    && (get_config('usersallowedmultipleinstitutions') || count($user->institutions) == 0)) {
    $options = array();
    foreach ($allinstitutions as $i) {
        if (!$user->in_institution($i->name) && $i->name != 'mahara') {
            $options[$i->name] = $i->displayname;
        }
    }
    if (!empty($options)) {
        $elements['addinstitution'] = array(
            'type'         => 'select',
            'title'        => get_string('addinstitution', 'admin'),
            'options'      => $options,
        );
        $elements['add'] = array(
            'type'  => 'submit',
            'value' => get_string('addinstitution','admin'),
        );
    }
}

Richard Mansfield's avatar
Richard Mansfield committed
280
281
282
283
284
285
286
287
288
$institutionform = pieform(array(
    'name'       => 'edituser_institution',
    'renderer'   => 'table',
    'plugintype' => 'core',
    'pluginname' => 'admin',
    'elements'   => $elements,
));

function edituser_institution_submit(Pieform $form, $values) {
289
290
    $user = new User;
    if (!$user->find_by_id($values['id'])) {
Richard Mansfield's avatar
Richard Mansfield committed
291
292
        return false;
    }
293
    $userinstitutions = $user->get('institutions');
Richard Mansfield's avatar
Richard Mansfield committed
294

295
    global $USER;
296
    foreach ($userinstitutions as $i) {
Richard Mansfield's avatar
Richard Mansfield committed
297
        if ($USER->can_edit_institution($i->institution)) {
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
            if (isset($values[$i->institution.'_submit'])) {
                $newuser = (object) array(
                    'usr'         => $user->id,
                    'institution' => $i->institution,
                    'ctime'       => $i->ctime,
                    'studentid'   => $values[$i->institution . '_studentid'],
                    'staff'       => (int) ($values[$i->institution . '_staff'] == 'on'),
                    'admin'       => (int) ($values[$i->institution . '_admin'] == 'on'),
                );
                if ($values[$i->institution . '_expiry']) {
                    $newuser->expiry = db_format_timestamp($values[$i->institution . '_expiry']);
                }
                db_begin();
                delete_records('usr_institution', 'usr', $user->id, 'institution', $i->institution);
                insert_record('usr_institution', $newuser);
                handle_event('updateuser', $user->id);
                db_commit();
                break;
            } else if (isset($values[$i->institution.'_remove'])) {
                db_begin();
                delete_records('usr_institution', 'usr', $user->id, 'institution', $i->institution);
                handle_event('updateuser', $user->id);
                db_commit();
                // Institutional admins can no longer access this page
                // if they remove the user from the institution, so
                // send them back to user search.
                if (!$USER->get('admin')) {
                    redirect('/admin/users/search.php');
                }
                break;
            }
        }
330
331
    }

332
333
334
335
336
337
    if (isset($values['add']) && $USER->get('admin')
        && (empty($userinstitutions) || get_config('usersallowedmultipleinstitutions'))) {
        // Do nothing if the user is already in the institution
        $addinstitution = get_record('institution', 'name', $values['addinstitution']);
        if (!$addinstitution || $addinstitution->name == 'mahara'
            || $user->in_institution($addinstitution->name)) {
Richard Mansfield's avatar
Richard Mansfield committed
338
339
            redirect('/admin/users/edit.php?id='.$user->id);
        }
340
341
342
343
344
        $now = time();
        if (!empty($addinstitution->defaultmembershipperiod)) {
            $expiry = db_format_timestamp($now + $addinstitution->defaultmembershipperiod);
        } else {
            $expiry = null;
Richard Mansfield's avatar
Richard Mansfield committed
345
        }
346
347
348
349
350
351
352
        db_begin();
        insert_record('usr_institution', (object) array(
            'usr' => $user->id,
            'institution' => $addinstitution->name,
            'ctime' => db_format_timestamp($now),
            'expiry' => $expiry,
        ));
353
        handle_event('updateuser', $user->id);
354
        db_commit();
Richard Mansfield's avatar
Richard Mansfield committed
355
356
357
358
    }

    redirect('/admin/users/edit.php?id='.$user->id);
}
359
360
361

$smarty = smarty();
$smarty->assign('user', $user);
362
363
364
365
$smarty->assign('suspended', $suspended);
if ($suspended) {
    $smarty->assign('suspendedby', get_string('suspendedby', 'admin', $suspender));
}
366
$smarty->assign('suspendform', $suspendform);
Richard Mansfield's avatar
Richard Mansfield committed
367
368
$smarty->assign('siteform', $siteform);
$smarty->assign('institutionform', $institutionform);
369
370
371
$smarty->display('admin/users/edit.tpl');

?>