.
*
* @package mahara
* @subpackage admin
* @author Catalyst IT Ltd
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL
* @copyright (C) 2006-2009 Catalyst IT Ltd http://catalyst.net.nz
*
*/
define('INTERNAL', 1);
define('INSTITUTIONALADMIN', 1);
require(dirname(dirname(dirname(__FILE__))) . '/init.php');
define('TITLE', get_string('Institutions', 'admin'));
define('SECTION_PLUGINTYPE', 'core');
define('SECTION_PLUGINNAME', 'admin');
define('SECTION_PAGE', 'institutions');
require_once('pieforms/pieform.php');
require_once('license.php');
define('MENUITEM', 'manageinstitutions/institutions');
$institution = param_variable('i', '');
$add = param_boolean('add');
$edit = param_boolean('edit');
$delete = param_boolean('delete');
$query = param_variable('query', '');
$offset = param_integer('offset', 0);
$limit = 20;
$customthemedefaults = array(
'background' => array('type' => 'color', 'value' => '#182768'),
'backgroundfg' => array('type' => 'color', 'value' => '#FFFFFF'),
'link' => array('type' => 'color', 'value' => '#d66800'),
'headings' => array('type' => 'color', 'value' => '#182768'),
'sidebarbg' => array('type' => 'color', 'value' => '#182768'),
'sidebarfg' => array('type' => 'color', 'value' => '#f1f2f8'),
'sidebarlink' => array('type' => 'color', 'value' => '#182768'),
'navbg' => array('type' => 'color', 'value' => '#f6871f'),
'navfg' => array('type' => 'color', 'value' => '#FFFFFF'),
'subbg' => array('type' => 'color', 'value' => '#fff4ea'),
'subfg' => array('type' => 'color', 'value' => '#14336F'),
'rowbg' => array('type' => 'color', 'value' => '#fff4ea'),
);
if (!$USER->get('admin')) {
// Institutional admins with only 1 institution go straight to the edit page for that institution
// They cannot add or delete institutions, or edit an institution they don't administer
$add = false;
$delete = false;
if (!empty($institution) && !$USER->is_institutional_admin($institution)) {
$institution = '';
$edit = false;
}
if (empty($institution) && count($USER->get('admininstitutions')) == 1) {
redirect(get_config('wwwroot') . 'admin/users/institutions.php?i='
. key($USER->get('admininstitutions')));
}
}
if ($institution || $add) {
$authinstances = auth_get_auth_instances_for_institution($institution);
if (false == $authinstances) {
$authinstances = array();
}
if ($delete) {
function delete_validate(Pieform $form, $values) {
// Ensure the institution has no members left
if ($members = get_field('usr_institution', 'COUNT(*)', 'institution', $values['i'])) {
$form->set_error('submit', get_string('institutionstillhas', 'admin', get_string('nmembers', 'group', $members)));
}
// If some users are still using one of this institution's authinstances, it's okay if
// we can find a default authinstance for those users, otherwise it's an error.
if ($authinstanceids = get_column('auth_instance', 'id', 'institution', $values['i'])) {
$badusers = count_records_select(
'usr',
'authinstance IN (' . join(',', array_fill(0, count($authinstanceids), '?')) . ')',
$authinstanceids
);
if ($badusers) {
$defaultauth = record_exists('auth_instance', 'institution', 'mahara', 'authname', 'internal');
if ($values['i'] == 'mahara' || !$defaultauth) {
$form->set_error(
'submit',
get_string('institutionauthinuseby', 'admin', get_string('nusers', 'mahara', $badusers))
);
}
}
}
}
function delete_cancel_submit() {
redirect('/admin/users/institutions.php');
}
function delete_submit(Pieform $form, $values) {
global $SESSION;
$authinstanceids = get_column('auth_instance', 'id', 'institution', $values['i']);
$viewids = get_column('view', 'id', 'institution', $values['i']);
$artefactids = get_column('artefact', 'id', 'institution', $values['i']);
$regdataids = get_column('institution_registration', 'id', 'institution', $values['i']);
db_begin();
if ($viewids) {
require_once(get_config('libroot') . 'view.php');
foreach ($viewids as $viewid) {
$view = new View($viewid);
$view->delete();
}
}
if ($artefactids) {
foreach ($artefactids as $artefactid) {
try {
$a = artefact_instance_from_id($artefactid);
$a->delete();
}
catch (ArtefactNotFoundException $e) {
// Awesome, it's already gone.
}
}
}
// If any users are still using this institution's authinstances, change them now.
if ($authinstanceids) {
execute_sql("
UPDATE {usr}
SET authinstance = (
SELECT MIN(id) FROM {auth_instance} WHERE institution = 'mahara' AND authname = 'internal'
)
WHERE authinstance IN (" . join(',', array_fill(0, count($authinstanceids), '?')) . ')',
$authinstanceids
);
}
foreach ($authinstanceids as $id) {
delete_records('auth_instance_config', 'instance', $id);
}
foreach ($regdataids as $id) {
delete_records('institution_registration_data', 'registration_id', $id);
}
// The institution should have been removed from favourites lists when the members were removed,
// but make sure it's gone.
execute_sql('DELETE FROM {favorite_usr} WHERE favorite IN (SELECT id FROM {favorite} WHERE institution = ?)', array($values['i']));
delete_records('favorite', 'institution', $values['i']);
execute_sql("UPDATE {group} SET institution = NULL, shortname = NULL WHERE institution = ?", array($values['i']));
delete_records('auth_instance', 'institution', $values['i']);
delete_records('host', 'institution', $values['i']);
delete_records('institution_locked_profile_field', 'name', $values['i']);
delete_records('usr_institution_request', 'institution', $values['i']);
delete_records('view_access', 'institution', $values['i']);
delete_records('institution_data', 'institution', $values['i']);
delete_records('institution_registration', 'institution', $values['i']);
delete_records('institution', 'name', $values['i']);
db_commit();
$SESSION->add_ok_msg(get_string('institutiondeletedsuccessfully', 'admin'));
redirect('/admin/users/institutions.php');
}
$form = array(
'name' => 'delete',
'elements' => array(
'i' => array(
'type' => 'hidden',
'value' => $institution
),
'delete' => array(
'type' => 'hidden',
'value' => 1
),
'submit' => array(
'type' => 'submitcancel',
'value' => array(get_string('yes'), get_string('no'))
)
)
);
$deleteform = pieform($form);
$smarty = smarty();
$smarty->assign('delete_form', $deleteform);
$smarty->assign('institutionname', get_field('institution', 'displayname', 'name', $institution));
$smarty->display('admin/users/institutions.tpl');
exit;
}
$instancearray = array();
$instancestring = '';
$c = count($authinstances);
$inuse = '';
$sitelockedfields = (array) get_column('institution_locked_profile_field', 'profilefield', 'name', 'mahara');
if (!$add) {
$data = get_record('institution', 'name', $institution);
$lockedprofilefields = (array) get_column('institution_locked_profile_field', 'profilefield', 'name', $institution);
// TODO: Find a better way to work around Smarty's minimal looping logic
if (!empty($authinstances)) {
foreach($authinstances as $key => $val) {
$authinstances[$key]->index = $key;
$authinstances[$key]->total = $c;
$instancearray[] = (int)$val->id;
}
$instancestring = implode(',',$instancearray);
$inuserecords = array();
if ($records = get_records_sql_assoc('select authinstance, count(id) from {usr} where authinstance in ('.$instancestring.') group by authinstance', array())) {
foreach ($records as $record) {
$inuserecords[] = $record->authinstance;
}
}
$inuse = implode(',',$inuserecords);
}
$authtypes = auth_get_available_auth_types($institution);
}
else {
$data = new StdClass;
$data->displayname = '';
$data->expiry = null;
if (!get_config('usersuniquebyusername')) {
$data->registerallowed = 1;
$data->registerconfirm = 1;
}
$data->theme = 'sitedefault';
$data->defaultmembershipperiod = null;
$data->showonlineusers = 2;
$data->allowinstitutionpublicviews = get_config('allowpublicviews') ? 1 : 0;
$data->licensemandatory = 0;
$data->licensedefault = '';
$data->dropdownmenu = get_config('dropdownmenu') ? 1 : 0;
$data->skins = get_config('skins') ? 1 : 0;
$lockedprofilefields = array();
$authtypes = auth_get_available_auth_types();
}
$themeoptions = get_institution_themes($institution);
$themeoptions['sitedefault'] = '- ' . get_string('sitedefault', 'admin') . ' (' . $themeoptions[get_config('theme')] . ') -';
uksort($themeoptions, 'theme_sort');
$showonlineusersoptions = array('0' => get_string('none'), '1' => get_string('institutiononly', 'admin'), '2' => get_string('all', 'admin'));
$sitename = get_config('sitename');
safe_require('artefact', 'internal');
$elements = array(
'name' => array(
'type' => 'text',
'title' => get_string('institutionname', 'admin'),
'rules' => array(
'required' => true,
'maxlength' => 255,
'regex' => '/^[a-zA-Z]+$/'
),
'ignore' => !$add,
'help' => true,
),
'add' => array(
'type' => 'hidden',
'value' => true,
'ignore' => !$add
),
'inuse' => array(
'type' => 'hidden',
'value' => $inuse,
'id' => 'inuse',
'ignore' => $add
),
'i' => array(
'type' => 'hidden',
'value' => $institution,
'ignore' => $add
),
'displayname' => array(
'type' => 'text',
'title' => get_string('institutiondisplayname', 'admin'),
'defaultvalue' => $data->displayname,
'rules' => array(
'required' => true,
'maxlength' => 255
),
'help' => true,
),
);
if ($USER->get('admin') && $institution != 'mahara') {
$elements['expiry'] = array(
'type' => 'date',
'title' => get_string('institutionexpiry', 'admin'),
'description' => get_string('institutionexpirydescription', 'admin', hsc($sitename)),
'defaultvalue' => is_null($data->expiry) ? null : strtotime($data->expiry),
'help' => true,
'minyear' => date('Y') - 2,
'maxyear' => date('Y') + 10,
);
}
if ($USER->get('admin')) {
$elements['authplugin'] = array(
'type' => 'authlist',
'title' => get_string('authplugin', 'admin'),
'options' => $authinstances,
'authtypes' => $authtypes,
'instancearray' => $instancearray,
'instancestring' => $instancestring,
'institution' => $institution,
'help' => true,
'ignore' => count($authtypes) == 0 || $institution == ''
);
}
if (!$add && empty($authinstances)) {
if ($USER->get('admin')) {
$SESSION->add_error_msg(get_string('adminnoauthpluginforinstitution', 'admin'));
}
else {
$SESSION->add_error_msg(get_string('noauthpluginforinstitution', 'admin'));
}
}
if (!get_config('usersuniquebyusername')) {
$elements['registerallowed'] = array(
'type' => 'checkbox',
'title' => get_string('registrationallowed', 'admin'),
'description' => get_string('registrationalloweddescription3', 'admin'),
'defaultvalue' => $data->registerallowed,
'help' => true,
);
$elements['registerconfirm'] = array(
'type' => 'checkbox',
'title' => get_string('registrationconfirm', 'admin'),
'description' => get_string('registrationconfirmdescription', 'admin'),
'defaultvalue' => $data->registerconfirm,
);
}
if (empty($data->name) || $data->name != 'mahara') {
$elements['defaultmembershipperiod'] = array(
'type' => 'expiry',
'title' => get_string('defaultmembershipperiod', 'admin'),
'description' => get_string('defaultmembershipperioddescription', 'admin'),
'defaultvalue' => $data->defaultmembershipperiod,
'help' => true,
);
$elements['logo'] = array(
'type' => 'file',
'title' => get_string('Logo', 'admin'),
'description' => get_string('logodescription', 'admin'),
'maxfilesize' => get_max_upload_size(false),
);
if (!empty($data->logo)) {
$logourl = get_config('wwwroot') . 'thumb.php?type=logobyid&id=' . $data->logo;
$elements['logohtml'] = array(
'type' => 'html',
'value' => '',
);
$elements['deletelogo'] = array(
'type' => 'checkbox',
'title' => get_string('deletelogo', 'admin'),
'description' => get_string('deletelogodescription', 'admin'),
);
}
if (!empty($data->style)) {
$customtheme = get_records_menu('style_property', 'style', $data->style, '', 'field,value');
}
$elements['theme'] = array(
'type' => 'select',
'title' => get_string('theme'),
'description' => get_string('sitethemedescription','admin'),
'defaultvalue' => $data->theme ? $data->theme : 'sitedefault',
'collapseifoneoption' => true,
'options' => $themeoptions,
'help' => true,
);
$elements['dropdownmenu'] = array(
'type' => 'checkbox',
'title' => get_string('dropdownmenu', 'admin'),
'description' => get_string('dropdownmenudescriptioninstitution','admin'),
'defaultvalue' => $data->dropdownmenu,
'help' => true,
);
if (get_config('skins')) {
$elements['skins'] = array(
'type' => 'checkbox',
'title' => get_string('skins', 'admin'),
'description' => get_string('skinsinstitutiondescription', 'admin'),
'defaultvalue' => $data->skins,
);
}
$elements['customthemefs'] = array(
'type' => 'fieldset',
'class' => 'customtheme' . ($elements['theme']['defaultvalue'] != 'custom' ? ' js-hidden' : ''),
'legend' => get_string('customtheme', 'admin'),
'elements' => array(),
);
foreach ($customthemedefaults as $name => $styledata) {
$elements['customthemefs']['elements'][$name] = array(
'type' => $styledata['type'],
'title' => get_string('customtheme.' . $name, 'admin'),
'defaultvalue' => isset($customtheme[$name]) ? $customtheme[$name] : $styledata['value'],
);
}
$elements['customthemefs']['elements']['resetcustom'] = array(
'type' => 'checkbox',
'class' => 'nojs-hidden-inline',
'title' => get_string('resetcolours', 'admin'),
'description' => get_string('resetcoloursdesc', 'admin'),
);
$elements['showonlineusers'] = array(
'type' => 'select',
'disabled' => get_config('showonlineuserssideblock') ? '' : 'disabled',
'title' => get_string('showonlineusers', 'admin'),
'description' => get_string('showonlineusersdescription','admin'),
'defaultvalue' => $data->showonlineusers,
'collapseifoneoption' => true,
'options' => $showonlineusersoptions,
);
if (get_config('licensemetadata')) {
$elements['licensemandatory'] = array(
'type' => 'checkbox',
'title' => get_string('licensemandatory', 'admin'),
'description' => get_string('licensemandatorydescription','admin'),
'defaultvalue' => $data->licensemandatory,
);
$elements['licensedefault'] = license_form_el_basic(null, true);
$elements['licensedefault']['title'] = get_string('licensedefault','admin');
$elements['licensedefault']['description'] = get_string('licensedefaultdescription','admin');
if ($data->licensedefault) {
$elements['licensedefault']['defaultvalue'] = $data->licensedefault;
}
}
if ($USER->get('admin') || get_config_plugin('artefact', 'file', 'institutionaloverride')) {
$elements['defaultquota'] = array(
'type' => 'bytes',
'title' => get_string('defaultquota', 'artefact.file'),
'description' => get_string('defaultinstitutionquotadescription', 'admin'),
'defaultvalue' => !empty($data->defaultquota) ? $data->defaultquota : get_config_plugin('artefact', 'file', 'defaultquota'),
);
$elements['updateuserquotas'] = array(
'title' => get_string('updateuserquotas', 'artefact.file'),
'description' => get_string('updateinstitutionuserquotasdesc', 'admin'),
'type' => 'checkbox',
);
}
else {
$elements['defaultquota'] = array(
'type' => 'text',
'title' => get_string('defaultquota', 'artefact.file'),
'value' => display_size(!empty($data->defaultquota) ? $data->defaultquota : get_config_plugin('artefact', 'file', 'defaultquota')),
'disabled' => true,
);
}
$elements['allowinstitutionpublicviews'] = array(
'type' => 'checkbox',
'title' => get_string('allowinstitutionpublicviews', 'admin'),
'description' => get_string('allowinstitutionpublicviewsdescription','admin'),
'defaultvalue' => get_config('allowpublicviews') && $data->allowinstitutionpublicviews,
'disabled' => get_config('allowpublicviews') == false,
'help' => true,
);
if ($USER->get('admin')) {
$elements['maxuseraccounts'] = array(
'type' => 'text',
'title' => get_string('maxuseraccounts','admin'),
'description' => get_string('maxuseraccountsdescription','admin'),
'defaultvalue' => empty($data->maxuseraccounts) ? '' : $data->maxuseraccounts,
'rules' => array(
'regex' => '/^\d*$/',
'maxlength' => 8,
),
'size' => 5,
);
}
}
$elements['lockedfields'] = array(
'type' => 'fieldset',
'legend' => get_string('Lockedfields', 'admin'),
'collapsible' => true,
'collapsed' => true,
'elements' => array(),
);
if ($institution != 'mahara') {
$elements['lockedfields']['elements']['description'] = array(
'type' => 'html',
'value' => get_string('disabledlockedfieldhelp', 'admin', get_field('institution', 'displayname', 'name', 'mahara')),
);
}
foreach (ArtefactTypeProfile::get_all_fields() as $field => $type) {
$elements['lockedfields']['elements'][$field] = array(
'type' => 'checkbox',
'title' => get_string($field, 'artefact.internal'),
'defaultvalue' => in_array($field, $lockedprofilefields) || ($institution != 'mahara' && in_array($field, $sitelockedfields)),
'disabled' => $institution != 'mahara' && in_array($field, $sitelockedfields)
);
}
$elements['lockedfieldshelp'] = array(
'value' => '