t('ID'), 'field' => 'u.uid', 'sort' => 'asc'),
array('data' => t('G2ID')),
array('data' => t('Username'), 'field' => 'u.name'),
array('data' => t('Status'), 'field' => 'u.status'),
array('data' => t('Sync Status')),
t('Operations')
);
$query = 'SELECT u.uid, u.name, u.status FROM {users} u WHERE uid != 0';
$status = array(t('blocked'), t('active'));
$destination = drupal_get_destination();
$filter = isset($_SESSION['gallery_user_filter']) ? $_SESSION['gallery_user_filter'] : FALSE;
if (!_gallery_init(TRUE)) {
return '';
}
list($ret, $g2_admin) = GalleryCoreApi::isUserInSiteAdminGroup();
if ($ret) {
gallery_error(t('Error calling \'GalleryCoreApi::isUserInSiteAdminGroup\'.'), $ret);
}
if ($filter) {
$result = db_query($query);
}
else {
$query .= tablesort_sql($header);
$result = pager_query($query, 50);
}
$rows = array();
while ($user = db_fetch_object($result)) {
$g2_userinfo = gallery_user_map_info(user_load(array('uid' => $user->uid)), FALSE);
$g2_id = ($g2_userinfo['g2_id'] >= 0) ? $g2_userinfo['g2_id'] : t('N/A');
$operations = array(l(t('edit'), "user/$user->uid/edit", array(), $destination));
if ($g2_admin && ($g2_userinfo['g2_id'] > 0)) {
$link_url = gallery_generate_url(array('view' => 'core.SiteAdmin',
'subView' => 'core.AdminEditUser',
'userId' => $g2_userinfo['g2_id']), FALSE);
$operations[] = l(t('edit G2'), $link_url);
}
if (count($g2_userinfo['status'])) {
$operations[] = l(t('sync'), 'admin/user/gallery/users/sync/'. $user->uid, array(), drupal_get_destination());
}
if ($filter) {
if ($filter == GALLERY_USERINFO_ERROR) {
if (!count($g2_userinfo['status'])) {
continue;
}
}
elseif (!in_array($filter, $g2_userinfo['status'])) {
continue;
}
}
$rows[] = array($user->uid,
$g2_id,
theme_username($user),
$status[$user->status],
implode(',
', gallery_user_map_info_status($g2_userinfo['status'])),
implode(' | ', $operations));
}
if ($filter && !count($rows)) {
$rows[] = array(array('data' => t('There are no users with the selected status.'), 'colspan' => '6', 'align' => 'center', 'class' => 'message'));
}
$output = drupal_get_form('_gallery_user_filter_form', $filter);
$output .= theme('table', $header, $rows);
$output .= theme('pager', array(), 50);
GalleryEmbed::done();
return $output;
}
/**
* Function _gallery_user_filter_form().
* (filter form for user status)
*/
function _gallery_user_filter_form($form_state, $filter) {
$form['filter'] = array(
'#type' => 'fieldset',
'#title' => t('Filter by status'),
'#collapsible' => TRUE,
'#collapsed' => !$filter,
);
$filter_options = gallery_user_map_info_status(array(), FALSE);
unset($filter_options[GALLERY_USERINFO_NOERROR]);
$form['filter']['filter_status'] = array(
'#type' => 'select',
'#title' => t('Show only users with status'),
'#options' => $filter_options,
'#default_value' => $filter,
);
$form['filter']['buttons']['submit'] = array(
'#type' => 'submit',
'#value' => t('Filter'),
'#submit' => array('_gallery_user_filter_submit')
);
if ($filter) {
$form['filter']['buttons']['reset'] = array(
'#type' => 'submit',
'#value' => t('Reset'),
'#submit' => array('_gallery_user_filter_reset')
);
}
return $form;
}
/**
* Function _gallery_user_filter_submit().
*/
function _gallery_user_filter_submit($form, &$form_state) {
$_SESSION['gallery_user_filter'] = $form_state['values']['filter_status'];
}
/**
* Function _gallery_user_filter_reset().
*/
function _gallery_user_filter_reset($form, &$form_state) {
unset($_SESSION['gallery_user_filter']);
}
/**
* Function _gallery_user_users_sync().
*/
function _gallery_user_users_sync($uid = NULL) {
// Sync the selected user
if (isset($uid) && is_numeric($uid)) {
_gallery_user_sync($uid);
}
drupal_goto('admin/user/gallery/users');
}
/**
* Function _gallery_user_advanced().
* (advanced user administration)
*/
function _gallery_user_advanced() {
$form['advanced'] = array(
'#type' => 'fieldset',
'#title' => t('Advanced Sync (Batch operations)'),
'#collapsible' => FALSE,
'#collapsed' => FALSE,
);
$form['advanced']['gallery_user_advanced_import'] = array(
'#type' => 'checkbox',
'#title' => t('Import users from Gallery2'),
'#return_value' => 1,
'#default_value' => FALSE,
'#description' => t('Use this option to import users from an existing Gallery2 install into Drupal.'),
);
$form['advanced']['gallery_user_advanced_sync'] = array(
'#type' => 'checkbox',
'#title' => t('Synchronize (export) all existing users'),
'#return_value' => 1,
'#default_value' => FALSE,
'#description' => t('Use this option to sync all users between Drupal and Gallery2.'),
);
$form['advanced']['gallery_user_advanced_offline'] = array(
'#type' => 'checkbox',
'#title' => t('Switch Drupal to \'offline mode\' for operation'),
'#return_value' => 1,
'#default_value' => FALSE,
'#disabled' => (user_access('administer site configuration') && !variable_get('site_offline', 0)) ? FALSE : TRUE,
'#prefix' => '
',
);
$form['buttons']['start'] = array('#type' => 'submit', '#value' => t('Start'));
$form['#validate'] = array('_gallery_user_advanced_validate');
$form['#submit'] = array('_gallery_user_advanced_submit');
return $form;
}
/**
* Function _gallery_user_advanced_validate().
*/
function _gallery_user_advanced_validate($form, &$form_state) {
if (($form_state['values']['gallery_user_advanced_import'] + $form_state['values']['gallery_user_advanced_sync']) < 1) {
form_set_error('', t('No option selected.'));
}
}
/**
* Function _gallery_user_advanced_submit().
*/
function _gallery_user_advanced_submit($form, &$form_state) {
if ($form_state['values']['gallery_user_advanced_offline']) {
variable_set('site_offline', 1);
$_SESSION['gallery_user_batch_offline'] = TRUE;
}
$operations = array();
if ($form_state['values']['gallery_user_advanced_import']) {
$operations[] = array('_gallery_user_advanced_import', array());
}
if ($form_state['values']['gallery_user_advanced_sync']) {
$operations[] = array('_gallery_user_advanced_sync', array());
}
$batch = array(
'title' => t('User Synchronization'),
'operations' => $operations,
'file' => drupal_get_path('module', 'gallery') .'/gallery_user_admin.inc',
'finished' => '_gallery_user_advanced_finished'
);
batch_set($batch);
}
/**
* Function _gallery_user_advanced_import().
*/
function _gallery_user_advanced_import(&$context) {
// Skip operation if an error occured
if (isset($context['results']['error']) && $context['results']['error']) {
$context['finished'] = $context['results']['error'] = 1;
return;
}
// Initialize G2
if (!_gallery_init(TRUE, NULL, FALSE)) {
gallery_error(t('Unable to initialize embedded Gallery.'));
$context['finished'] = $context['results']['error'] = 1;
return;
}
// First pass
if (empty($context['sandbox'])) {
// Initialize batch variables
$context['finished'] = 0;
$context['sandbox']['progress'] = 0;
// Total number of G2 users
list($ret, $context['sandbox']['max']) = GalleryCoreApi::fetchUserCount();
if ($ret || !$context['sandbox']['max']) {
gallery_error(t('Error getting number of G2 users'), $ret);
$context['finished'] = $context['results']['error'] = 1;
return;
}
// Flush entity cache
gallery_flush_entity_cache();
// Import Gallery2 groups
if (variable_get('gallery_user_import_groups', 1)) {
_gallery_groups_import();
}
}
// Fetch a list of G2 users
list($ret, $g2_users) = GalleryCoreApi::fetchUsernames(GALLERY_BATCH_INTERVAL, $context['sandbox']['progress']);
if ($ret) {
gallery_error(t('Error fetching G2 usernames'), $ret);
$context['finished'] = $context['results']['error'] = 1;
return;
}
else {
if (!_gallery_user_import($g2_users, $context['results']['messages'])) {
$context['finished'] = $context['results']['error'] = 1;
return;
}
}
$context['sandbox']['progress'] += GALLERY_BATCH_INTERVAL;
$context['finished'] = 1;
if ($context['sandbox']['progress'] < $context['sandbox']['max']) {
$context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
}
}
/**
* Function _gallery_user_advanced_sync().
*/
function _gallery_user_advanced_sync(&$context) {
// Skip operation if an error occured
if (isset($context['results']['error']) && $context['results']['error']) {
$context['finished'] = $context['results']['error'] = 1;
return;
}
// Initialize G2
if (!_gallery_init(TRUE, NULL, FALSE)) {
gallery_error(t('Unable to initialize embedded Gallery.'));
$context['finished'] = $context['results']['error'] = 1;
return;
}
// First pass
if (empty($context['sandbox'])) {
// Initialize batch variables
$context['finished'] = 0;
$context['sandbox']['progress'] = 0;
// Total number of users
$total = db_fetch_object(db_query("SELECT COUNT(*) AS users FROM {users} WHERE uid > 0"));
if (!$total->users) {
$context['finished'] = $context['results']['error'] = 1;
return;
}
$context['sandbox']['max'] = $total->users;
// Empty externalIdMap in first pass
if (variable_get('gallery_user_sync_remap', 0)) {
$ret = GalleryCoreApi::removeAllMapEntries('ExternalIdMap');
if ($ret) {
gallery_error(t('Error emptying \'ExternalIdMap\''), $ret);
$context['finished'] = $context['results']['error'] = 1;
return;
}
}
}
// Sync users
$result = db_query_range("SELECT uid FROM {users} WHERE uid > 0", $context['sandbox']['progress'], GALLERY_BATCH_INTERVAL);
while ($user = db_fetch_object($result)) {
if ($account = user_load(array('uid' => $user->uid))) {
if (!gallery_user_modify($account, 'update', !$context['sandbox']['progress'])) {
$context['finished'] = $context['results']['error'] = 1;
return;
}
}
}
$context['sandbox']['progress'] += GALLERY_BATCH_INTERVAL;
$context['finished'] = 1;
if ($context['sandbox']['progress'] < $context['sandbox']['max']) {
$context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
}
}
/**
* Function _gallery_user_advanced_finished().
*/
function _gallery_user_advanced_finished($success, $results, $operations) {
if (isset($_SESSION['gallery_user_batch_offline'])) {
variable_set('site_offline', 0);
unset($_SESSION['gallery_user_batch_offline']);
}
//
if ($success) {
if (isset($results['error']) && $results['error']) {
drupal_set_message(t('User synchronization (partially) failed.'), 'error');
}
else {
if (isset($results['messages']) && count($results['messages'])) {
drupal_set_message(theme('item_list', $results['messages'], t('The following messages occured:')), 'notice');
drupal_set_message(''. t('Invalid user items were skipped.') .'', 'notice');
watchdog('gallery', theme('item_list', $results['messages'], t('The following messages occured:')), WATCHDOG_NOTICE);
}
else {
drupal_set_message(t('User synchronization successfully completed.'));
}
}
}
else {
$error_operation = reset($operations);
drupal_set_message(t('An error occurred while processing @operation', array('@operation' => $error_operation[0])), 'error');
}
}
/**
* Function _gallery_user_settings().
*/
function _gallery_user_settings() {
require_once(drupal_get_path('module', 'gallery') .'/gallery_settings.inc');
$form['user'] = array(
'#type' => 'fieldset',
'#title' => t('Settings'),
'#collapsible' => FALSE,
'#collapsed' => FALSE
);
// General (not sync related) settings
$form['user']['gallery_user_hide_profile'] = array(
'#type' => 'checkbox',
'#title' => t('Hide Gallery2 section in profiles'),
'#default_value' => variable_get('gallery_user_hide_profile', 0),
'#description' => t('Hide the Gallery2 section (i.e. Gallery2-Drupal Sync Status) on the user profile pages.'),
);
// Sync settings
$form['user']['sync'] = array(
'#type' => 'fieldset',
'#title' => t('User Synchronization'),
'#collapsible' => TRUE,
'#collapsed' => FALSE
);
$roles = array(0 => t('none'));
$roles += user_roles(TRUE);
unset($roles[DRUPAL_AUTHENTICATED_RID]);
$form['user']['sync']['gallery_user_admin_role'] = array(
'#type' => 'select',
'#title' => t('Drupal \'admin\' role'),
'#default_value' => variable_get('gallery_user_admin_role', 0),
'#options' => $roles,
'#description' => t('Select the Drupal role equivalent to Gallery2\'s \'Site Admin\' group (or \'none\' to disable this
feature). The roles \'anonymous\' and \'authenticated\' are not available for selection.'),
);
$form['user']['sync']['gallery_user_locked'] = array(
'#type' => 'checkbox',
'#title' => t('Lock G2 accounts'),
'#default_value' => variable_get('gallery_user_locked', 0),
'#description' => t('Locking G2 account prevents users from changing their details (password, email, ...) in G2.'),
);
// Fullname settings
$profile_status = module_exists('profile');
$profile_status_str = theme('gallery_module_status_message', $profile_status);
$desc = t('Full names in Gallery2 can be supported by using the profile module
(!profile_status) with a \'Full Name\' profile field as defined below.',
array('!profile_status' => $profile_status_str)
);
if (!$profile_status) {
$desc .= t(' However the profile module is disabled, so this functionality is
not available and the options are disabled.');
}
$form['user']['sync']['fullname'] = array(
'#type' => 'fieldset',
'#title' => t('Full Name settings'),
'#collapsible' => TRUE,
'#collapsed' => !$profile_status,
'#description' => $desc,
);
if ($profile_status) {
$usefullname = variable_get('gallery_use_fullname', 0);
$form['user']['sync']['fullname']['gallery_use_fullname'] = array(
'#type' => 'checkbox',
'#title' => t('Enable Full Name support'),
'#return_value' => 1,
'#default_value' => $usefullname,
'#disabled' => !$profile_status,
'#description' => t('Use full name from profile module in Gallery2 user data. Note that
enabling/disabling this only updates Gallery2 user data when the
Drupal user is updated or if a user sync is performed.'),
);
if ($usefullname) {
$categories = array();
$result = db_query('SELECT DISTINCT(category) FROM {profile_fields}');
while ($category = db_fetch_object($result)) {
$categories[$category->category] = $category->category;
}
$default_category = variable_get('gallery_profile_fullname_category', 'Personal Information');
$form['user']['sync']['fullname']['gallery_profile_fullname_category'] = array(
'#type' => 'select',
'#title' => t('Full name profile category'),
'#default_value' => $default_category,
'#options' => $categories,
'#description' => t('Name of the category containing the \'Full Name\' field in profile module.'),
);
$fields = array();
$result = _profile_get_fields($default_category);
while ($field = db_fetch_object($result)) {
$fields[$field->name] = $field->title;
}
$form['user']['sync']['fullname']['gallery_profile_fullname_field'] = array(
'#type' => 'select',
'#title' => t('Full name profile field'),
'#default_value' => variable_get('gallery_profile_fullname_field', 'profile_fullname'),
'#options' => $fields,
'#description' => t('Name of \'Full Name\' field in profile module.'),
);
}
}
// Import behaviour
$form['user']['sync']['import'] = array(
'#type' => 'fieldset',
'#title' => t('Advanced Sync - Import'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
$form['user']['sync']['import']['gallery_user_import_groups'] = array(
'#type' => 'checkbox',
'#title' => t('Import Gallery2 groups'),
'#default_value' => variable_get('gallery_user_import_groups', 1),
'#description' => t('Import Gallery2 groups into Drupal roles (in addition to users).'),
);
$form['user']['sync']['import']['gallery_user_import_override'] = array(
'#type' => 'checkbox',
'#title' => t('Override existing Drupal users'),
'#default_value' => variable_get('gallery_user_import_override', 0),
'#description' => t('Replaces user details (password, email, groups, ...) of existing Drupal users with Gallery2 imported values.'),
);
$form['user']['sync']['import']['gallery_user_import_conflict'] = array(
'#type' => 'checkboxes',
'#title' => t('Auto-resolve email address conflicts'),
'#default_value' => variable_get('gallery_user_import_conflict', array()),
'#options' => array(
GALLERY_IMPORT_CONFLICT_DUPLICATE => t('Duplicate e-mail addresses'),
GALLERY_IMPORT_CONFLICT_INVALID => t('Invalide e-mail addresses')
),
'#description' => t('Renames duplicate/invalid e-mail addresses to username@drupaldomain.
If this option is disabled you get a list of users to handle conflicts yourself.')
);
// Export behaviour
$form['user']['sync']['export'] = array(
'#type' => 'fieldset',
'#title' => t('Advanced Sync - Export (Synchronize)'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
$form['user']['sync']['export']['gallery_user_sync_remap'] = array(
'#type' => 'checkbox',
'#title' => t('Remap all users'),
'#default_value' => variable_get('gallery_user_sync_remap', 0),
'#description' => t('Remaps all users instead of missing or mismatching ones only.
This will completely flush Gallery2\'s \'externalIdMap\'.'),
);
$form = system_settings_form($form);
$form['#submit'] = array('_gallery_user_settings_submit', 'system_settings_form_submit');
return $form;
}
/**
* Function _gallery_user_settings_submit().
*/
function _gallery_user_settings_submit($form, &$form_state) {
if ($form_state['values']['op'] == t('Reset to defaults')) {
$fullname_changed = variable_get('gallery_use_fullname', 0);
}
else {
$fullname_changed = (isset($form_state['values']['gallery_use_fullname'])
&& ($form_state['values']['gallery_use_fullname'] != variable_get('gallery_use_fullname', 0)));
}
if ($fullname_changed) {
drupal_set_message(t('Full Name settings have changed. You should now synchronize
your users on the Gallery users page.',
array('@user-admin' => url('admin/user/gallery'))));
}
}