Index: nodeaccess.install =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/nodeaccess/Attic/nodeaccess.install,v retrieving revision 1.1.2.5.2.1 diff -u -r1.1.2.5.2.1 nodeaccess.install --- nodeaccess.install 21 Jul 2008 23:28:46 -0000 1.1.2.5.2.1 +++ nodeaccess.install 12 Feb 2009 23:07:02 -0000 @@ -1,5 +1,7 @@ $name) { variable_del('nodeaccess_' . $type); + variable_del('nodeaccess_' . $type . '_userreference'); } // Remove tables. drupal_uninstall_schema('nodeaccess'); } -?> + Index: nodeaccess.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/nodeaccess/nodeaccess.module,v retrieving revision 1.4.2.7.2.9.2.1 diff -u -r1.4.2.7.2.9.2.1 nodeaccess.module --- nodeaccess.module 21 Jul 2008 23:28:46 -0000 1.4.2.7.2.9.2.1 +++ nodeaccess.module 12 Feb 2009 23:07:02 -0000 @@ -169,6 +169,24 @@ $form['nodeaccess'][$type]['roles'][$id]['grant_update'] = array('#type' => 'checkbox', '#default_value' => $opts[$id]['grant_update']); $form['nodeaccess'][$type]['roles'][$id]['grant_delete'] = array('#type' => 'checkbox', '#default_value' => $opts[$id]['grant_delete']); } + + // Set the default permissions if userreference exists and is enabled on + // the content type. + if (module_exists('userreference')) { + $type_info = content_types($type); + $fields = $type_info['fields']; + + $userreference_perms = variable_get('nodeaccess_' . $type . '_userreference', array()); + foreach ($fields as $field) { + if ($field['type'] == 'userreference') { + $form['nodeaccess'][$type]['userreference'][$field['field_name']]['name'] = array('#value' => $field['widget']['label']); + $form['nodeaccess'][$type]['userreference'][$field['field_name']]['enabled'] = array('#type' => 'checkbox', '#default_value' => $userreference_perms[$field['field_name']]['enabled']); + $form['nodeaccess'][$type]['userreference'][$field['field_name']]['grant_view'] = array('#type' => 'checkbox', '#default_value' => $userreference_perms[$field['field_name']]['grant_view']); + $form['nodeaccess'][$type]['userreference'][$field['field_name']]['grant_update'] = array('#type' => 'checkbox', '#default_value' => $userreference_perms[$field['field_name']]['grant_update']); + $form['nodeaccess'][$type]['userreference'][$field['field_name']]['grant_delete'] = array('#type' => 'checkbox', '#default_value' => $userreference_perms[$field['field_name']]['grant_delete']); + } + } + } } $form['submit'] = array('#type' => 'submit', '#value' => t('Save Grants')); return $form; @@ -219,6 +237,14 @@ $allowed_types[$type] = 0; } $author_prefs[$type] = $form_values[$type]['author']; + // Also save userreference default permissions if enabled. + if (module_exists('userreference') && isset($form_values[$type]['userreference'])) { + $userreference_grants = array(); + foreach ($form_values[$type]['userreference'] as $userreference_field => $val) { + $userreference_grants[$userreference_field] = array('gid' => 'nodeaccess_uid', 'enabled' => $val['enabled'], 'grant_view' => $val['grant_view'], 'grant_update' => $val['grant_update'], 'grant_delete' => $val['grant_delete']); + } + variable_set('nodeaccess_' . $type . '_userreference', $userreference_grants); + } } variable_set('nodeaccess_authors', $author_prefs); // Save allowed node types. @@ -267,6 +293,23 @@ $output .= theme('table', $header, array($row)); $output .= '' . t('The settings selected for the node author will define what permissions the node author has. This cannot be changed on individual node grants.') . ''; + + if (module_exists('userreference') && isset($form['userreference'])) { + $userreference_fields = element_children($form['userreference']); + $header = array(t('User Reference Field'), t('Enable this field'), t('View'), t('Edit'), t('Delete')); + $rows = array(); + foreach ($userreference_fields as $userreference_field) { + $row = array(); + $row[] = drupal_render($form['userreference'][$userreference_field]['name']); + $row[] = drupal_render($form['userreference'][$userreference_field]['enabled']); + $row[] = drupal_render($form['userreference'][$userreference_field]['grant_view']); + $row[] = drupal_render($form['userreference'][$userreference_field]['grant_update']); + $row[] = drupal_render($form['userreference'][$userreference_field]['grant_delete']); + $rows[] = $row; + } + $output .= theme('table', $header, $rows); + $output .= '' . t('If enabled, the value of the user reference field will be granted the associated permissions. If a user changes the value of the user reference field on a node, the associated user will be modified in the node-specific access table.') . ''; + } return $output; } @@ -427,6 +470,16 @@ * Submit function for nodeaccess_grants_form. */ function nodeaccess_grants_form_submit($form, &$form_state) { + _nodeaccess_grants_form_submit($form, $form_state); + drupal_set_message(t('Grants saved.')); +} + +/** + * Private function to submit the per-node grants table. We use this so any + * user notifications aren't displayed when a userreference field causes the + * updating. + */ +function _nodeaccess_grants_form_submit($form, &$form_state) { $form_values =& $form_state['values']; global $user; $grants = array(); @@ -458,8 +511,6 @@ db_query("INSERT INTO {nodeaccess} (nid, gid, realm, grant_view, grant_update, grant_delete) VALUES (%d, %d, '%s', %d, %d, %d)", $nid, $grant['gid'], $grant['realm'], $grant['grant_view'], $grant['grant_update'], $grant['grant_delete']); } - - drupal_set_message(t('Grants saved.')); } /** @@ -571,6 +622,15 @@ $realm = 'nodeaccess_' . $type; node_access_write_grants($node, $grants, $realm); } + if (module_exists('userreference')) { + $fields = variable_get('nodeaccess_' . $node->type . '_userreference', array()); + foreach (array_keys($fields) as $field_name) { + if (isset($node->$field_name)) { + nodeaccess_insert_userreference($node); + break; + } + } + } // Done, default permissions are not written into nodeaccess. break; case 'update': @@ -583,6 +643,20 @@ $grants = array(); $grants[] = $grant; node_access_write_grants($node, $grants, 'nodeaccess_author'); + if (module_exists('userreference')) { + $fields = variable_get('nodeaccess_' . $node->type . '_userreference', array()); + foreach (array_keys($fields) as $field_name) { + if (isset($node->$field_name)) { + $old_node = node_load($node->nid); + // Delete the old user as it's changed. + if ($node->$field_name != $old_node->$field_name) { + nodeaccess_delete_userreference($old_node); + nodeaccess_insert_userreference($node); + } + break; + } + } + } // Done, author permissions are not written into nodeaccess. break; case 'delete': @@ -731,4 +805,79 @@ return $success; } -?> +/** + * Insert userreference grants from a node. + * @param $node + * The node with enabled userreference grants to insert. + */ +function nodeaccess_insert_userreference($node) { + $form_values = _nodeaccess_get_grants($node); + + // Now, append or overwrite the uid with what was specified in the user + // reference field. + $fields = variable_get('nodeaccess_' . $node->type . '_userreference', array()); + foreach ($fields as $field_name => $field) { + foreach ($node->$field_name as $values) { + // Add the settings for this UID. If the UID is zero, then the + // userreference field is set to None. + if ($values['uid'] > 0) { + $user = user_load($values['uid']); + $form_values['uid'][$user->uid] = array('name' => $user->name, 'keep' => 1, 'grant_view' => $field['grant_view'], 'grant_update' => $field['grant_update'], 'grant_delete' => $field['grant_delete']); + } + } + } + // Only do the changes if there are users to save. + if (count($form_values['uid']) > 0) { + $form_values['nid'] = $node->nid; + $form_state = array('values' => $form_values); + _nodeaccess_grants_form_submit(NULL, $form_state); + } +} + +/** + * Delete all userreference user grants from a node. + * + * @param $node + * The node with userreference fields that need to be deleted from the user + * grants table. + */ +function nodeaccess_delete_userreference($node) { + $form_values = _nodeaccess_get_grants($node); + // Now, append or overwrite the uid with what was specified in the user + // reference field. + $fields = variable_get('nodeaccess_' . $node->type . '_userreference', array()); + foreach ($fields as $field_name => $field) { + foreach ($node->$field_name as $values) { + // Add the settings for this UID + $user = user_load($values['uid']); + unset($form_values['uid'][$user->uid]); + } + } + $form_values['nid'] = $node->nid; + $form_state = array('values' => $form_values); + _nodeaccess_grants_form_submit(NULL, $form_state); +} + +/** + * Return the grants applied to a node object. This is used to generate values + * for the Grants form. + * + * @param $node + * The node to return grants for. + * @return array + * An array of grants with keys 'rid' for roles and 'uid' for users. + */ +function _nodeaccess_get_grants($node) { + $grants = array(); + // Load all roles. + $result = db_query("SELECT r.rid, nra.name, na.grant_view, na.grant_update, na.grant_delete FROM {role} r LEFT JOIN {nodeaccess_role_alias} nra ON r.rid = nra.rid LEFT JOIN {node_access} na ON r.rid = na.gid AND na.realm = '%s' AND na.nid = %d ORDER BY nra.weight, nra.name", 'nodeaccess_rid', $node->nid); + while ($grant = db_fetch_object($result)) { + $grants['rid'][$grant->rid] = array('name' => $grant->name, 'grant_view' => (boolean)$grant->grant_view, 'grant_update' => (boolean)$grant->grant_update, 'grant_delete' => (boolean)$grant->grant_delete); + } + // Load users from node_access. + $result = db_query("SELECT uid, name, grant_view, grant_update, grant_delete FROM {node_access} LEFT JOIN {users} ON uid = gid WHERE nid = %d AND realm = '%s' ORDER BY name", $node->nid, 'nodeaccess_uid'); + while ($account = db_fetch_object($result)) { + $grants['uid'][$account->uid] = array('name' => $account->name, 'keep' => 1, 'grant_view' => $account->grant_view, 'grant_update' => $account->grant_update, 'grant_delete' => $account->grant_delete); + } + return $grants; +}