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;
+}