You are here

agreement.install in Agreement 7.2

Install, update and uninstall functions for Agreement module.

File

agreement.install
View source
<?php

/**
 * @file
 * Install, update and uninstall functions for Agreement module.
 */

/**
 * Create a default agreement based on current variables.
 *
 * @return array
 *   Agreement type.
 */
function _agreement_default_agreement() {
  $text = variable_get('agreement_text', array(
    'value' => '',
    'format' => filter_default_format(),
  ));
  $default = array(
    'name' => 'default',
    'type' => 'Default agreement',
    'path' => variable_get('agreement_page_url', 'agreement'),
    'agreement' => $text['value'],
    'settings' => array(
      'role' => array(
        variable_get('agreement_role', 2),
      ),
      'title' => variable_get('agreement_page_title', 'Our Agreement'),
      'format' => $text['format'],
      'frequency' => variable_get('agreement_frequency', 0),
      'success' => variable_get('agreement_message_success', 'Thank you for accepting our agreement.'),
      'failure' => variable_get('agreement_message_failure', 'You must accept our agreement to continue.'),
      'revoked' => variable_get('agreement_message_revoked', 'You successfully revoked your acceptance of our agreement.'),
      'checkbox' => variable_get('agreement_checkbox_text', 'I agree.'),
      'submit' => variable_get('agreement_submit_text', 'Submit'),
      'destination' => variable_get('agreement_success_destination', ''),
      'visibility_settings' => variable_get('agreement_page_visibility_settings', 0),
      'visibility_pages' => variable_get('agreement_page_visibility_pages', ''),
      'email_recipient' => variable_get('agreement_email_recipient', ''),
      'reset_date' => variable_get('agreement_reset', 0),
    ),
  );
  return $default;
}

/**
 * Implements hook_install().
 */
function agreement_install() {

  // Set module weight.
  $n = db_update('system')
    ->condition('name', 'agreement', '=')
    ->fields(array(
    'weight' => 9999,
  ))
    ->execute();
  if ($n != 1) {
    drupal_set_message(st('Could not set agreement module weight.'), 'error');
  }

  // Add a default agreement.
  $default = (object) _agreement_default_agreement();
  $default->settings = serialize($default->settings);
  drupal_write_record('agreement_type', $default);
}

/**
 * Implements hook_schema().
 */
function agreement_schema() {
  $schema['agreement'] = array(
    'fields' => array(
      'id' => array(
        'type' => 'serial',
        'unsigned' => TRUE,
        'not null' => TRUE,
      ),
      'type' => array(
        'type' => 'varchar',
        'length' => 100,
        'not null' => TRUE,
        'default' => 'default',
      ),
      'uid' => array(
        'type' => 'int',
        'unsigned' => TRUE,
        'not null' => TRUE,
      ),
      'agreed' => array(
        'type' => 'int',
        'unsigned' => TRUE,
        'not null' => TRUE,
        'default' => 0,
      ),
      'sid' => array(
        'type' => 'varchar',
        'length' => 46,
      ),
      'agreed_date' => array(
        'type' => 'int',
        'unsigned' => TRUE,
        'not null' => TRUE,
      ),
    ),
    'primary key' => array(
      'id',
    ),
    'indexes' => array(
      'type_uid' => array(
        'type',
        'uid',
      ),
    ),
  );
  $schema['agreement_type'] = array(
    'fields' => array(
      'id' => array(
        'type' => 'serial',
        'unsigned' => TRUE,
        'not null' => TRUE,
      ),
      'name' => array(
        'type' => 'varchar',
        'length' => 100,
        'not null' => TRUE,
      ),
      'type' => array(
        'type' => 'varchar',
        'length' => 150,
        'not null' => TRUE,
      ),
      'path' => array(
        'type' => 'varchar',
        'length' => 150,
        'not null' => TRUE,
      ),
      'settings' => array(
        'type' => 'blob',
        'size' => 'big',
        'not null' => TRUE,
      ),
      'agreement' => array(
        'type' => 'text',
        'not null' => FALSE,
      ),
    ),
    'primary key' => array(
      'id',
    ),
    'unique keys' => array(
      'name' => array(
        'name',
      ),
      'path' => array(
        'path',
      ),
    ),
  );
  return $schema;
}

/**
 * Implements hook_uninstall().
 */
function agreement_uninstall() {
  variable_del('agreement_role');
  variable_del('agreement_frequency');
  variable_del('agreement_text');
  variable_del('agreement_page_title');
  variable_del('agreement_page_url');
  variable_del('agreement_message_success');
  variable_del('agreement_message_failure');
  variable_del('agreement_message_revoked');
  variable_del('agreement_checkbox_text');
  variable_del('agreement_submit_text');
  variable_del('agreement_success_destination');
  variable_del('agreement_page_visibility_settings');
  variable_del('agreement_page_visibility_pages');
  variable_del('agreement_email_recipient');
}

/**
 * Migrate from 'skip agreement' to 'bypass agreement' permission.
 */
function agreement_update_7200() {

  // Find any permissions that a user may have configured without running the
  // update.
  $rids = array();
  $query = db_select('role_permission', 'rp');
  $res = $query
    ->condition('module', 'agreement')
    ->condition('permission', 'bypass agreement')
    ->fields('rp', array(
    'rid',
  ))
    ->execute();
  foreach ($res as $rec) {
    $rids[] = $rec->rid;
  }

  // Update any role permission from skip agreement to bypass agreement.
  $query = db_update('role_permission');
  $query
    ->condition('module', 'agreement')
    ->condition('permission', 'skip agreement')
    ->fields(array(
    'permission' => 'bypass agreement',
  ));
  if (!empty($rids)) {

    // Do not update already configured role permissions.
    $query
      ->condition('rid', $rids, 'NOT IN');
  }
  $updated_num = $query
    ->execute();
  $deleted_num = 0;
  if (!empty($rids)) {

    // Remove old role permissions if already configured role permissions exist.
    $query = db_delete('role_permission');
    $deleted_num = $query
      ->condition('rid', $rids, 'IN')
      ->condition('permission', 'skip agreement')
      ->condition('module', 'agreement')
      ->execute();
  }
  $items = array();
  $items[] = format_plural($updated_num, 'Updated 1 permission', 'Updated @count permissions');
  $items[] = format_plural(count($rids), 'Ignored 1 existing permission', 'Ignored @count existing permissions');
  $items[] = format_plural($deleted_num, 'Deleted 1 old permission', 'Deleted @count old permissions');
  return theme('item_list', array(
    'items' => $items,
  ));
}

/**
 * 7201: Add a type column to {agreement} table.
 */
function agreement_update_7201() {
  if (!db_field_exists('agreement', 'type')) {
    db_add_field('agreement', 'type', array(
      'type' => 'varchar',
      'length' => 100,
      'not null' => TRUE,
      'default' => 'default',
    ));
  }
  if (!db_index_exists('agreement', 'type_uid')) {
    db_add_index('agreement', 'type_uid', array(
      'type',
      'uid',
    ));
  }
  if (!db_table_exists('agreement_type')) {
    $schema = agreement_schema();
    db_create_table('agreement_type', $schema['agreement_type']);
  }
  return t('Updated agreement schema and added agreement_type table.');
}

/**
 * 7202: Add a default agreement.
 */
function agreement_update_7202() {
  $default = (object) _agreement_default_agreement();
  $default->settings = serialize($default->settings);
  $types = agreement_type_load();
  if (empty($types)) {
    drupal_write_record('agreement_type', $default);
  }
  return t('Added default agreement type.');
}

/**
 * 7203: Update the stored agreement frequency.
 */
function agreement_update_7203() {
  $agreements = agreement_type_load();
  if (!empty($agreements)) {
    $names = array_keys($agreements);
    foreach ($agreements as $name => $info) {
      $frequency = $info['settings']['frequency'];
      $info['settings']['reset_date'] = $name === 'default' ? variable_get('agreement_reset', 0) : 0;
      $info['settings']['frequency'] = $frequency == 0 ? -1 : 0;
      agreement_type_save($info);
    }
    $name_string = implode(' ', $names);
    return t('Updated frequency and added reset_date to the following agreements: !names', array(
      '!names' => $name_string,
    ));
  }
  return t('No agreement types to update.');
}

/**
 * 7204: Update agreements with default values for revoke agreement.
 */
function agreement_update_7204() {
  $default_revoke_message = agreement_get_translated_message('AGREEMENT_MESSAGE_REVOKED');
  $agreements = agreement_type_load();
  if (!empty($agreements)) {
    $names = array_keys($agreements);
    foreach ($agreements as $name => $info) {
      $info['settings']['revoked'] = $default_revoke_message;
      agreement_type_save($info);
    }
    $name_string = implode(' ', $names);
    return t('Updated agreements: !names', array(
      '!names' => $name_string,
    ));
  }
  return t('No agreement types to update.');
}

/**
 * 7025: Updates agreement.settings.role to be an array.
 */
function agreement_update_7205() {
  $agreements = agreement_type_load();
  if (!empty($agreements)) {
    $names = array_keys($agreements);
    foreach ($agreements as $name => $info) {
      if (!is_array($info['settings']['role'])) {
        $info['settings']['role'] = array(
          $info['settings']['role'],
        );
        agreement_type_save($info);
      }
    }
    $name_string = implode(' ', $names);
    return t('Updated agreements: !names', array(
      '!names' => $name_string,
    ));
  }
  return t('No agreement types to update.');
}

Functions

Namesort descending Description
agreement_install Implements hook_install().
agreement_schema Implements hook_schema().
agreement_uninstall Implements hook_uninstall().
agreement_update_7200 Migrate from 'skip agreement' to 'bypass agreement' permission.
agreement_update_7201 7201: Add a type column to {agreement} table.
agreement_update_7202 7202: Add a default agreement.
agreement_update_7203 7203: Update the stored agreement frequency.
agreement_update_7204 7204: Update agreements with default values for revoke agreement.
agreement_update_7205 7025: Updates agreement.settings.role to be an array.
_agreement_default_agreement Create a default agreement based on current variables.