t('Stores information about each group.'), 'fields' => array( 'nid' => array( 'description' => t("The group's {node}.nid."), 'type' => 'int', 'size' => 'normal', 'not null' => TRUE, ), 'og_selective' => array( 'description' => t('Determines how subscription requests are handled (open, moderated, invite only, closed).'), 'type' => 'int', 'size' => 'normal', 'not null' => TRUE, 'default' => 0, ), 'og_description' => array( 'description' => t('Group description. Shows up by default on group directory.'), 'type' => 'varchar', 'length' => 255, 'not null' => FALSE, ), 'og_theme' => array( 'description' => t('The group specific theme (if any). See {system}.name.'), 'type' => 'varchar', 'length' => 255, 'not null' => FALSE, ), 'og_register' => array( 'description' => t('Should users be able to join this group from registration form.'), 'type' => 'int', 'size' => 'tiny', 'not null' => TRUE, 'default' => 0, ), 'og_directory' => array( 'description' => t('Should this group appear in the groups directory.'), 'type' => 'int', 'size' => 'tiny', 'not null' => TRUE, 'default' => 0, ), 'og_language' => array( 'description' => t('Group specific language. See {languages}.language.'), 'type' => 'varchar', 'length' => 12, 'not null' => TRUE, 'default' => '', ), 'og_private' => array( 'description' => t('Is group home page private or public.'), 'type' => 'int', 'size' => 'tiny', 'not null' => TRUE, 'default' => 0, ), ), 'primary key' => array('nid'), ); $schema['og_uid'] = array( 'description' => t('Group memberships'), 'fields' => array( 'nid' => array( 'description' => t("Group's {node}.nid."), 'type' => 'int', 'size' => 'normal', 'not null' => TRUE, ), 'og_role' => array( 'description' => t('Not currently used.'), 'type' => 'int', 'size' => 'tiny', 'not null' => TRUE, 'default' => 0, ), 'is_active' => array( 'description' => t('Is this membership active or pending?'), 'type' => 'int', 'size' => 'tiny', 'not null' => TRUE, 'default' => 0, ), 'is_admin' => array( 'description' => t('Is this user a group administrator?'), 'type' => 'int', 'size' => 'tiny', 'not null' => TRUE, 'default' => 0, ), 'uid' => array( 'description' => t('The user for this membership. See {users}.uid.'), 'type' => 'int', 'size' => 'normal', 'not null' => TRUE, ), 'created' => array( 'description' => t('Time when this membership was created.'), 'type' => 'int', 'size' => 'normal', 'not null' => FALSE, 'default' => 0, ), 'changed' => array( 'description' => t('Time when this membership was last changed.'), 'type' => 'int', 'size' => 'normal', 'not null' => FALSE, 'default' => 0, ), ), 'primary key' => array('nid', 'uid'), ); $schema['og_ancestry'] = array( 'description' => '', 'fields' => array( 'nid' => array( 'description' => t("The post's {node}.nid."), 'type' => 'int', 'size' => 'normal', 'not null' => TRUE, ), 'group_nid' => array( 'description' => t("The group's {node}.nid."), 'type' => 'int', 'size' => 'normal', 'not null' => TRUE, ), 'is_public' => array( 'description' => t('Is this a public or private post? This value is always the same across all groups for a given post.'), 'type' => 'int', 'size' => 'tiny', 'default' => 1, 'not null' => TRUE, ), ), 'indexes' => array( 'nid' => array('nid'), 'group_nid' => array('group_nid'), ), ); return $schema; } function og_install() { drupal_install_schema('og'); // enable standard og blocks. for custom profiles, block may not be included yet. if (function_exists('_block_rehash')) { _block_rehash(); } // Need og_readme() function. drupal_load('module', 'og'); drupal_set_message(t('Organic groups module enabled. Please see the included !readme_file for further installation instructions.', array('!readme_file' => og_readme()))); } // First 5.x update. // use the new na_arbitrator way of writing to node_access table function og_update_14() { switch ($GLOBALS['db_type']) { case 'mysql': case 'mysqli': $ret[] = update_sql("CREATE TABLE {og_ancestry} ( nid int(11) NOT NULL, group_nid int(11) NOT NULL, is_public int(1) NULL, KEY (nid), KEY (group_nid) ) /*!40100 DEFAULT CHARACTER SET utf8 */;"); break; case 'pgsql': db_query("CREATE TABLE {og_ancestry} ( nid int NOT NULL, group_nid int NOT NULL, is_public smallint NOT NULL );"); db_query("CREATE INDEX {og_ancestry}_nid_idx ON {og_ancestry} (nid);"); db_query("CREATE INDEX {og_ancestry}_group_nid_idx ON {og_ancestry} (group_nid);"); break; } og_migrate_type_basic_14(); // populate og_ancestry. $result = db_query_temporary( "SELECT na.nid, na.gid, IF(MIN(na.realm) = 'og_all', 1, 0) AS is_public FROM {node_access} na INNER JOIN {node} n ON na.nid=n.nid WHERE realm IN ('og_all', 'og_subscriber') AND n.type NOT IN ('%s') GROUP BY na.nid, na.gid ORDER BY nid ASC", implode(', ', variable_get('og_node_types', array('og'))), 'og_migrate'); $sql = "INSERT INTO {og_ancestry} (nid, group_nid, is_public) SELECT nid, gid, is_public FROM {og_migrate}"; db_query($sql); // rebuild takes care of writing new access records // too bad this part can't be performed over multiple updates node_access_rebuild(); return array(); } // Create a user managed node type which replaces the deprecated og_basic module // helper function for og_update_14 function og_migrate_type_basic_14() { if (og_is_group_type('og')) { $info = array('type' => 'og', 'name' => 'group', 'module' => 'node', 'has_title' => 1, 'title_label' => 'Group name', 'has_body' => 1, 'body_label' => 'Welcome message', 'description' => 'A group provides a home page for like minded users. There they post articles about their shared interest.', 'help' => '', 'min_word_count' => 0, 'custom' => 1, 'modified' => 1, 'locked' => 0, 'orig_type' => 'og'); node_type_save((object)$info); module_disable(array('og_basic')); node_types_rebuild(); } } function og_update_15() { variable_del('og_max_posts'); variable_del('og_home_page_presentation'); return array(); } function og_update_16() { // we are no longer denying access to nodes without groups. see http://drupal.org/node/107289 if (variable_get('og_enabled', 0)) { node_access_rebuild(); } return array(); } function og_update_17() { // we are once again putting group nodes into the node access system. see http://drupal.org/node/128306 if (variable_get('og_enabled', 0)) { node_access_rebuild(); } return array(); } function og_update_18() { // woops. got it a bit wrong last time if (variable_get('og_enabled', 0)) { node_access_rebuild(); } return array(); } // Formerly contained og_uid_global code which is no longer required. function og_update_19() { return array(); } function og_update_20() { switch ($GLOBALS['db_type']) { case 'mysql': case 'mysqli': $ret[] = update_sql("ALTER TABLE {og} ADD private int(1) NOT NULL default 0"); break; case 'pgsql': $ret[] = update_sql("ALTER TABLE {og} ADD private smallint NOT NULL default 0"); break; } return $ret; } /** * Changes '@body' to '@node_teaser' in existing e-mail templates. */ function og_update_5600() { $ret = array(); $variables = array('og_new_node_body', 'og_new_node_subject'); foreach ($variables as $variable) { $value = variable_get($variable, ''); if (!empty($value)) { variable_set($variable, str_replace('@body', '@node_teaser', $value)); $ret[] = array('success' => TRUE, 'query' => "Replaced @body with @node_teaser in $variable"); } } return $ret; } /** * Enable og_access module if needed */ function og_update_5700() { $ret = array(); if (variable_get('og_enabled', FALSE) && !module_exists('og_access')) { drupal_install_modules('og_access'); } // variable_del('og_enabled'); is harmless to leave around, and will help if someone reruns the update. return $ret; } /** * Update variables to new content type system. Also rebuild node_access for new grants system. * * @return void **/ function og_update_5701() { $ret = array(); $types = node_get_types(); foreach ($types as $type) { if (in_array($type->type, variable_get('og_node_types', array('og')))) { variable_set('og_content_type_usage_'. $type->type, 'group'); } elseif (in_array($type->type, variable_get('og_omitted', array('og')))) { variable_set('og_content_type_usage_'. $type->type, 'omitted'); } elseif (in_array($type->type, variable_get('og_omitted_email_node_types', array('og')))) { variable_set('og_content_type_usage_'. $type->type, 'group_post_standard_nomail'); } else { variable_set('og_content_type_usage_'. $type->type, 'group_post_standard_mail'); } } node_access_rebuild(); return $ret; } /** * Notifications upgrade: Set flag to indicate that this is an upgraded * installation. */ function og_update_5703() { // Remove mail / no mail options from OG group types and move preferences to // og_notifications. drupal_load('module', 'og'); $types = og_get_types('group_post'); $mail_types = array(); foreach ($types as $type) { $variable = 'og_content_type_usage_'. $type; $usage = variable_get($variable, ''); switch ($usage) { case 'group_post_standard_mail': $mail_types[$type] = $type; case 'group_post_standard_nomail': variable_set($variable, 'group_post_standard'); break; case 'group_post_wiki_mail': $mail_types[$type] = $type; case 'group_post_wiki_nomail': variable_set($variable, 'group_post_wiki'); break; } } // Set variable for og_notifications. If it is never enabled, this variable // is also deleted in og_uninstall. variable_set('og_notifications_content_types', $mail_types); // Vestigial variable. variable_del('og_omitted_email_node_types'); // Set update flag for og_notifications. variable_set('og_notifications_update_required', 1); return array(); } function og_update_6000() { $ret = array(); // Fix how we append the custom request text from a group join request. $name = 'og_request_user_body'; if ($txt = variable_get($name, FALSE)) { $txt .= "\n\nPersonal message from @username:\n------------------\n\n@request"; variable_set($name, $txt); } return $ret; } // Update to support views modularization while retaining backward compatibility. function og_update_6001() { $ret = array(); drupal_install_modules(array('og_views')); //enable the og_views block instead of the plain og one $ret[] = update_sql("UPDATE {blocks} SET module = 'og_views', delta = '1' WHERE module = 'og' AND delta = '5'"); return $ret; } // Change field names in {og} table. Enables use of drupal_write_record() function og_update_6002() { $ret = array(); $schema = drupal_get_schema_unprocessed('og', 'og'); $fields = $schema['fields']; db_change_field($ret, 'og', 'selective', 'og_selective', $fields['og_selective']); db_change_field($ret, 'og', 'register', 'og_register', $fields['og_register']); db_change_field($ret, 'og', 'theme', 'og_theme', $fields['og_theme']); db_change_field($ret, 'og', 'directory', 'og_directory', $fields['og_directory']); db_change_field($ret, 'og', 'description', 'og_description', $fields['og_description']); db_change_field($ret, 'og', 'language', 'og_language', $fields['og_language']); db_change_field($ret, 'og', 'private', 'og_private', $fields['og_private']); return $ret; } // end updates // function og_uninstall() { drupal_uninstall_schema('og'); // In case og_notifications has never been enabled, the vestigial // og_uid_global table will still be around. if (variable_get('og_notifications_update_required', FALSE)) { db_query('DROP TABLE {og_uid_global}'); } // Delete variables $variables = array( 'og_help', 'og_block_cnt_2', 'og_block_cnt_3', 'og_audience_checkboxes', 'og_omitted', 'og_content_type_usage', 'og_audience_required', 'og_visibility_directory', 'og_visibility_registration', 'og_home_page_view', 'og_email_max', 'og_node_types', 'og_admin_email_body', 'og_email_notification_pattern', 'og_approve_user_body', 'og_approve_user_subject', 'og_deny_user_body', 'og_deny_user_subject', 'og_invite_user_body', 'og_invite_user_subject', 'og_new_admin_body', 'og_new_admin_subject', 'og_new_node_body', 'og_new_node_subject', 'og_request_user_body', 'og_request_user_subject', 'og_notifications_update_required', 'og_notifications_content_types' ); foreach ($variables as $variable) { variable_del($variable); } } function og_requirements($phase) { // Need og_readme() function. drupal_load('module', 'og'); $requirements = array(); // Ensure translations don't break at install time $t = get_t(); if ($phase == 'runtime') { $og_types = og_get_types('group'); $all_types = array_keys(node_get_types('types')); if (!count(array_intersect($og_types, $all_types))) { $requirements['og_group_types'] = array( 'title' => $t('Organic groups group type'), 'value' => $t('You have no node types which are acting as groups. See the notes section of the !readme_file and the content types fieldset at top of OG settings.', array('!readme_file' => og_readme(), '!settings' => url('admin/og/og'))), 'severity' => REQUIREMENT_ERROR, ); } if (!module_exists('og_access')) { $requirements['og_access'] = array( 'title' => $t('Organic groups access control'), 'value' => $t('Organic groups access control module is disabled. See the modules page.', array('@modules' => url('admin/build/modules'))), 'severity' => REQUIREMENT_INFO ); } } return $requirements; }