gallery_user_admin.inc 19.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
<?php
// $Id$

require_once(drupal_get_path('module', 'gallery') .'/gallery_user.inc');

/**
 * gallery.module : gallery_user_admin.inc
 * Gallery User Administration
 */
 
11
define('GALLERY_BATCH_INTERVAL', 10);
12 13 14 15 16

/**
 * Function _gallery_user_users().
 * (gallery users page - view list of users)
 */
17
function _gallery_user_users() {
18 19 20 21 22 23 24 25 26 27 28 29 30
  // Generate user status overview
  $header = array(
    array('data' => 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();
31
  $filter = isset($_SESSION['gallery_user_filter']) ? $_SESSION['gallery_user_filter'] : FALSE;
32 33 34 35 36 37 38 39 40

  if (!_gallery_init(TRUE)) {
    return '';
  }
  list($ret, $g2_admin) = GalleryCoreApi::isUserInSiteAdminGroup();
  if ($ret) {
    gallery_error(t('Error calling \'GalleryCoreApi::isUserInSiteAdminGroup\'.'), $ret);
  }
  
41
  if ($filter) {
42 43 44 45 46 47 48
    $result = db_query($query);
  }
  else {
    $query .= tablesort_sql($header);
    $result = pager_query($query, 50);
  }
  
49
  $rows = array();
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
  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());
    }
    
68
    if ($filter) {
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
      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(',<br />', 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)
 */
103
function _gallery_user_filter_form($form_state, $filter) {
104 105 106 107 108 109 110 111 112 113 114 115 116 117
  $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,
  );
118 119 120 121 122
  $form['filter']['buttons']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Filter'),
    '#submit' => array('_gallery_user_filter_submit')
  );
123
  if ($filter) {
124 125 126 127 128
    $form['filter']['buttons']['reset'] = array(
      '#type' => 'submit',
      '#value' => t('Reset'),
      '#submit' => array('_gallery_user_filter_reset')
    );
129 130 131 132 133 134 135 136
  }
  
  return $form;
}

/**
 * Function _gallery_user_filter_submit().
 */
137 138 139 140 141 142 143 144
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) {
145
  unset($_SESSION['gallery_user_filter']);
146 147 148 149 150 151 152 153 154
}

/**
 * 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);
155
  }
156 157

  drupal_goto('admin/user/gallery/users');
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
}

/**
 * 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' => '<br />',
  );
  
  $form['buttons']['start'] = array('#type' => 'submit', '#value' => t('Start'));
196 197
  $form['#validate'] = array('_gallery_user_advanced_validate');
  $form['#submit'] = array('_gallery_user_advanced_submit');
198 199 200 201 202 203
  return $form;
}

/**
 * Function _gallery_user_advanced_validate().
 */
204 205
function _gallery_user_advanced_validate($form, &$form_state) {
  if (($form_state['values']['gallery_user_advanced_import'] + $form_state['values']['gallery_user_advanced_sync']) < 1) {
206 207 208 209 210 211 212
    form_set_error('', t('No option selected.'));
  }
}

/**
 * Function _gallery_user_advanced_submit().
 */
213 214 215 216 217 218 219 220 221 222 223 224
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());
225
  }
226 227 228 229 230 231 232 233 234
  
  $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);
235 236 237 238 239
}

/**
 * Function _gallery_user_advanced_import().
 */
240 241 242 243 244 245 246 247 248 249
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)) {
    $context['finished'] = $context['results']['error'] = 1;
    return;
250 251
  }
  // First pass
252 253 254 255 256 257 258 259 260 261 262
  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;
    }
263 264 265 266 267 268 269 270
    // 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
271
  list($ret, $g2_users) = GalleryCoreApi::fetchUsernames(GALLERY_BATCH_INTERVAL, $context['sandbox']['progress']);
272 273
  if ($ret) {
    gallery_error(t('Error fetching G2 usernames'), $ret);
274 275
    $context['finished'] = $context['results']['error'] = 1;
    return;
276 277
  }
  else {
278 279 280
    if (!_gallery_user_import($g2_users, $context['results']['messages'])) {
      $context['finished'] = $context['results']['error'] = 1;
      return;
281 282
    }
  }
283 284 285 286 287
  $context['sandbox']['progress'] += GALLERY_BATCH_INTERVAL;
  $context['finished'] = 1;
  if ($context['sandbox']['progress'] < $context['sandbox']['max']) {
    $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
  }
288 289 290 291 292
}

/**
 * Function _gallery_user_advanced_sync().
 */
293 294 295 296 297 298 299 300 301 302
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)) {
    $context['finished'] = $context['results']['error'] = 1;
    return;
303
  }
304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323
  // 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;
      }
324 325 326
    }
  }
  // Sync users
327
  $result = db_query_range("SELECT uid FROM {users} WHERE uid > 0", $context['sandbox']['progress'], GALLERY_BATCH_INTERVAL);
328 329
  while ($user = db_fetch_object($result)) {
    if ($account = user_load(array('uid' => $user->uid))) {
330 331 332
      if (!gallery_user_modify($account, 'update', !$context['sandbox']['progress'])) {
        $context['finished'] = $context['results']['error'] = 1;
        return;
333 334 335
      }
    }
  }
336 337 338 339 340
  $context['sandbox']['progress'] += GALLERY_BATCH_INTERVAL;
  $context['finished'] = 1;
  if ($context['sandbox']['progress'] < $context['sandbox']['max']) {
    $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
  }
341 342 343
}

/**
344
 * Function _gallery_user_advanced_finished().
345
 */
346 347 348 349 350 351 352 353 354
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');
355 356
    }
    else {
357 358
      if (isset($results['messages']) && count($results['messages'])) {
        drupal_set_message(theme('item_list', $results['messages'], t('The following messages occured:')), 'notice');
359
        drupal_set_message('<strong>'. t('Invalid user items were skipped.') .'</strong>', 'notice');
360
        watchdog('gallery', theme('item_list', $results['messages'], t('The following messages occured:')));
361 362
      }
      else {
363
        drupal_set_message(t('User synchronization successfully completed.'));
364 365 366
      }
    }
  }
367 368 369 370
  else {
    $error_operation = reset($operations);
    drupal_set_message(t('An error occurred while processing @operation', array('@operation' => $error_operation[0])), 'error');
  }
371 372 373 374 375 376 377 378 379 380 381 382 383 384 385
}

/**
 * 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
  );
  
386 387
  // General settings
  $form['user']['gallery_user_profile_hide'] = array(
388 389
    '#type' => 'checkbox',
    '#title' => t('Hide Gallery2 section in profiles'),
390
    '#default_value' => variable_get('gallery_user_profile_hide', 0),
391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450
    '#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.'),
    );
451
    
452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530
    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\'.'),
  );
  
531 532 533
  $form = system_settings_form($form);
  $form['#submit'] = array('_gallery_user_settings_submit', 'system_settings_form_submit');
  return $form;
534 535 536 537 538
}

/**
 * Function _gallery_user_settings_submit().
 */
539 540
function _gallery_user_settings_submit($form, &$form_state) {
  if ($form_state['values']['op'] == t('Reset to defaults')) {
541 542 543
    $fullname_changed = variable_get('gallery_use_fullname', 0);
  } 
  else {
544 545
    $fullname_changed = (isset($form_state['values']['gallery_use_fullname'])
      && ($form_state['values']['gallery_use_fullname'] != variable_get('gallery_use_fullname', 0)));
546 547 548 549 550 551 552
  }
  if ($fullname_changed) {
      drupal_set_message(t('Full Name settings have changed. You should now synchronize
                            your users on the <a href="@user-admin">Gallery users</a> page.',
                            array('@user-admin' => url('admin/user/gallery'))));
  }
}