diff --git a/includes/og_features_permission.features.inc b/includes/og_features_permission.features.inc new file mode 100644 index 0000000..a47c0c2 --- /dev/null +++ b/includes/og_features_permission.features.inc @@ -0,0 +1,197 @@ + $bundles) { + foreach ($bundles as $bundle => $permissions) { + foreach ($permissions as $permission => $info) { + $key = $group_type . ':' . $bundle . ':' . $permission; + $name = '(' . $group_type . ':' . $bundle . ') ' . $permission; + $options[$key] = strip_tags($module_info[$info['module']]['name'] . ': ' . $name); + } + } + } + + return $options; +} + +/** + * Implements hook_Features_export_render(). + */ +function og_features_permission_features_export_render($module, $data) { + $code = array(); + $code[] = ' $permissions = array();'; + $code[] = ''; + + $perms = _og_features_get_permissions(); + + foreach($data as $key) { + list($group_type, $bundle, $perm) = explode(':', $key); + + $permission = array(); + if (!empty($perms[$group_type][$bundle][$perm]['roles'])) { + $roles = $perms[$group_type][$bundle][$perm]['roles']; + $permission['roles'] = array_combine($roles, $roles); + } + else { + $permission['roles'] = array(); + } + + $perm_identifier = features_var_export($key); + $perm_export = features_var_export($permission, ' '); + $code[] = " // Exported og permission: {$perm_identifier}"; + $code[] = " \$permissions[{$perm_identifier}] = {$perm_export};"; + $code[] = ''; + } + $code[] = ' return $permissions;'; + + $code = implode("\n", $code); + return array('og_features_default_permissions' => $code); +} + +/** + * Implements hook_features_revert(). + */ +function og_features_permission_features_revert($module) { + og_features_permission_features_rebuild($module); +} + +/** + * Implements hook_features_rebuild(). + * Iterates through default permissions and update the permissions map. + * + * @param $module + * The modules whose default user permissions should be rebuild. + */ +function og_features_permission_features_rebuild($module) { + require_once(dirname(__FILE__) . '/og_features_role.features.inc'); + + if ($defaults = features_get_default('og_features_permission', $module)) { + $grant = array(); + $revoke = array(); + + foreach($defaults as $key => $details) { + list($group_type, $bundle, $perm) = explode(':', $key); + + // Make sure the role exists for this entity. + foreach($details['roles'] as $role) { + $bundle_role = _og_features_role_exists($role, $group_type, $bundle); + if (empty($bundle_role)) { + og_role_save((object)$details); + } + } + + $roles = og_roles($group_type, $bundle, 0); + foreach($roles as $rid => $rolename) { + if (in_array($rolename, $details['roles'])) { + $grant[$rid][] = $perm; + } + else { + $revoke[$rid][] = $perm; + } + } + } + + if (!empty($grant)) { + foreach($grant as $rid => $permissions) { + og_role_grant_permissions($rid, $permissions); + } + } + + if (!empty($revoke)) { + foreach($revoke as $rid => $permissions) { + og_role_revoke_permissions($rid, $permissions); + } + } + } +} + +/** + * Get all defined permissions keyed by permission with + */ +function _og_features_get_permissions() { + $return = array(); + + $query = db_select('og_role', 'ogr'); + $query->innerJoin('og_role_permission', 'ogrp', 'ogr.rid = ogrp.rid'); + + $result = $query->condition('ogr.gid', '0') + ->fields('ogr', array('group_type', 'group_bundle', 'name')) + ->fields('ogrp', array('permission')) + ->orderBy('ogr.group_type') + ->orderBy('ogr.group_bundle') + ->orderBy('ogrp.permission') + ->execute(); + + $assigned_perms = array(); + while ($row = $result->fetchAssoc()) { + $assigned_perms[$row['group_type']][$row['group_bundle']][$row['permission']][] = $row['name']; + } + + $perms = og_get_permissions(); + + $groups = og_get_all_group_bundle(); + foreach ($groups as $group_type => $bundles) { + foreach ($bundles as $bundle => $name) { + foreach($perms as $perm => $info) { + if (empty($assigned_perms[$group_type][$bundle][$perm])) { + $return[$group_type][$bundle][$perm]['roles'] = array(); + } + else { + $return[$group_type][$bundle][$perm]['roles'] = $assigned_perms[$group_type][$bundle][$perm]; + } + $return[$group_type][$bundle][$perm]['module'] = $info['module']; + } + } + } + return $return; +} \ No newline at end of file diff --git a/includes/og_features_role.features.inc b/includes/og_features_role.features.inc new file mode 100644 index 0000000..60f5721 --- /dev/null +++ b/includes/og_features_role.features.inc @@ -0,0 +1,125 @@ + $bundles) { + foreach ($bundles as $bundle => $name) { + $roles = og_roles($group_type, $bundle, 0); + foreach ($roles as $rid => $role) { + if (!in_array($role, $default_roles)) { + $key = $group_type . ':' . $bundle . ':' . $role; + $options[$key] = $key; + } + } + } + } + + return $options; +} + +/** + * Implements hook_features_export_render(). + */ +function og_features_role_features_export_render($module, $data) { + $code = array(); + $code[] = ' $roles = array();'; + $code[] = ''; + + foreach ($data as $name) { + list($group_type, $bundle, $rolename) = explode(':', $name); + $role = array( + 'gid' => 0, + 'group_type' => $group_type, + 'group_bundle' => $bundle, + 'name' => $rolename, + ); + $role_identifier = features_var_export($name); + $role_export = features_var_export($role, ' '); + $code[] = " // Exported OG Role: {$role_identifier}."; + $code[] = " \$roles[{$role_identifier}] = ${role_export};"; + $code[] = ""; + } + + $code[] = ' return $roles;'; + $code = implode("\n", $code); + + return array('og_features_default_roles' => $code); +} + +/** + * Implements hook_features_revert(). + */ +function og_features_role_features_revert($module) { + og_features_role_features_rebuild($module); +} + +/** + * Implements hook_features_rebuild(). + * Iterates through default permissions and update the permissions map. + * + * @param $module + * The modules whose default roles should be rebuild. + */ +function og_features_role_features_rebuild($module) { + if ($defaults = features_get_default('og_features_role', $module)) { + foreach ($defaults as $key => $value) { + list($group_type, $bundle, $name) = explode(':', $key); + $role = (object) $value; + if ($rid = _og_features_role_exists($name, $group_type, $bundle)) { + $role->rid = $rid; + } + og_role_save($role); + } + } +} + +/** + * Returns rid if role with $name exists, FALSE otherwise + * + * @param $name string the role name + * @param $group_type the entity type + * @param $bundle the bundle + * @return mixed integer indicating rid if the role exists FALSE otherwise + */ +function _og_features_role_exists($name, $group_type, $bundle) { + $roles = og_roles($group_type, $bundle, 0); + if (in_array($name, $roles)) { + $flipped = array_flip($roles); + return $flipped[$name]; + } + else { + return FALSE; + } +} \ No newline at end of file diff --git a/og.module b/og.module index b7759c5..c81d415 100644 --- a/og.module +++ b/og.module @@ -3310,3 +3310,26 @@ function og_operations_load_action_includes() { return $files; } + + +/** + * Implements hook_features_api(). + */ +function og_features_api() { + return array( + 'og_features_role' => array( + 'name' => t('OG Role'), + 'feature source' => TRUE, + 'default_hook' => 'og_features_default_roles', + 'default_file' => FEATURES_DEFAULTS_INCLUDED, + 'file' => drupal_get_path('module', 'og') .'/includes/og_features_role.features.inc', + ), + 'og_features_permission' => array( + 'name' => t('OG Permissions'), + 'feature_source' => TRUE, + 'default_hook' => 'og_features_default_permissions', + 'default_file' => FEATURES_DEFAULTS_INCLUDED, + 'file' => drupal_get_path('module', 'og') .'/includes/og_features_permission.features.inc', + ), + ); +}