Commit 2be3942d authored by David Norman's avatar David Norman

issue #51454 fix add/delete buddylist users

parent 4b0c0d8b
Readme
------
This module allows users to put each other on a personal 'Buddy List'.
Features include buddy groups and the ability to track your buddies' recent posts.
Send comments to Robert Douglass at: http://drupal.org/user/5449/contact
Requirements
------------
This module requires Drupal 4.7.
This module does not yet offer PostgreSQL support. If you would like to contribute to this module by creating the appropriate PostgreSQL schema, please submit your code at http://drupal.org/project/issues/buddylist
Upgrading from 4.6
------------------
WARNING: There is currently no migration path from 4.6 to 4.7. There are significant database schema changes and the 4.7 module will not work with the 4.6 schema. A migration path is forthcoming. If you need one sooner, contact me: http://drupal.org/user/5449/contact
Installation
------------
1. Copy the buddylist.module to the Drupal modules/ directory.
2. Enable buddy list in the "site settings | modules" administration screen.
Enabling the buddylist module will trigger the creation of the database schema. If you are shown error messages you may have to create the schema by hand. Please see the database definition at the end of this file.
3. Enable buddy list blocks you want in the "blocks" administration screen.
4. Optionally add the following theme function to your PHPTemplate's template.php file:
function phptemplate_username($object) {
global $user;
/* Use the default theme_username for anonymous users, nodes by this user */
if ($user->uid == 0 || $object->uid == $user->uid || $object->uid == 0) {
return theme_username($object);
}
if (!user_access('maintain buddy list')) {
return theme_username($object);
}
/* an array, keyed on buddy uids */
$buddies = buddylist_get_buddies($user->uid);
/* Find out if this buddy is in the user's buddy list */
foreach ($buddies as $buddyuid => $buddystructure) {
if ($buddyuid == $object->uid) {
$output .= theme_username($object);
$output .= " (";
$output .= theme('remove_from_buddylist_link', $object);
$output .= ")";
return $output;
}
}
/* The user is not in the buddylist, give a link to add */
$output .= theme_username($object);
$output .= " (";
$output .= theme('add_to_buddylist_link', $object);
$output .= ")";
return $output;
}
Database Schema
---------------
If the automatic creation of the database tables was unsuccessful you can try creating the tables by hand using the following SQL:
CREATE TABLE `buddylist` (
`uid` int(10) unsigned NOT NULL default '0',
`buddy` int(10) unsigned NOT NULL default '0',
`timestamp` int(11) NOT NULL default '0',
`received` tinyint(1) NOT NULL default '0',
UNIQUE KEY `uid-buddy-label` (`uid`,`buddy`),
KEY `uid` (`uid`)
) TYPE=MyISAM /*!40100 DEFAULT CHARACTER SET utf8 */;
--
-- Table structure for table `buddylist_buddy_group`
--
CREATE TABLE `buddylist_buddy_group` (
`uid` int(11) NOT NULL default '0',
`buddy` int(11) NOT NULL default '0',
`label_id` int(11) NOT NULL default '0',
PRIMARY KEY (`uid`,`buddy`,`label_id`)
) TYPE=MyISAM /*!40100 DEFAULT CHARACTER SET utf8 */;
--
-- Table structure for table `buddylist_groups`
--
CREATE TABLE `buddylist_groups` (
`uid` int(11) NOT NULL default '0',
`label_id` int(11) NOT NULL default '0',
`label` varchar(255) NOT NULL default '',
`visible` tinyint(1) NOT NULL default '0',
PRIMARY KEY (`uid`,`label_id`)
) TYPE=MyISAM /*!40100 DEFAULT CHARACTER SET utf8 */;
Credits
-------
Written by Adrian Rossouw.
Thanks to Ratko Kovacina for the comments/debugging info
Browsing improvements by Doug Sikora
Maintainer: Robert Douglass
Status: maintained (Feb. 2006)
TODO
----
1. PGSQL schema (see buddylist.install, buddylist_install())
2. Rework texts so that one is not stuck with "buddy" but could choose "contact", for example
3. Make a workflow whereby a buddy request is sent to the buddy for confirmation which is required before the buddy can be added.
4. Make the notification that someone added you to their buddylist use the privatemsg module, if available.
Readme
------
This module allows users to put each other on a personal 'Buddy List'.
Features include buddy groups and the ability to track your buddies' recent posts.
Send comments to Robert Douglass at: http://drupal.org/user/5449/contact
Requirements
------------
This module requires Drupal 4.7.
This module does not yet offer PostgreSQL support. If you would like to contribute to this module by creating the appropriate PostgreSQL schema, please submit your code at http://drupal.org/project/issues/buddylist
Upgrading from 4.6
------------------
WARNING: There is currently no migration path from 4.6 to 4.7. There are significant database schema changes and the 4.7 module will not work with the 4.6 schema. A migration path is forthcoming. If you need one sooner, contact me: http://drupal.org/user/5449/contact
Installation
------------
1. Copy the buddylist.module to the Drupal modules/ directory.
2. Enable buddy list in the "site settings | modules" administration screen.
Enabling the buddylist module will trigger the creation of the database schema. If you are shown error messages you may have to create the schema by hand. Please see the database definition at the end of this file.
3. Enable buddy list blocks you want in the "blocks" administration screen.
4. Optionally add the following theme function to your PHPTemplate's template.php file:
function phptemplate_username($object) {
global $user;
/* Use the default theme_username for anonymous users, nodes by this user */
if ($user->uid == 0 || $object->uid == $user->uid || $object->uid == 0) {
return theme_username($object);
}
if (!user_access('maintain buddy list')) {
return theme_username($object);
}
/* an array, keyed on buddy uids */
$buddies = buddylist_get_buddies($user->uid);
/* Find out if this buddy is in the user's buddy list */
foreach ($buddies as $buddyuid => $buddystructure) {
if ($buddyuid == $object->uid) {
$output .= theme_username($object);
$output .= ' (';
$output .= theme('remove_from_buddylist_link', $object);
$output .= ')';
return $output;
}
}
/* The user is not in the buddylist, give a link to add */
$output .= theme_username($object);
$output .= ' (';
$output .= theme('add_to_buddylist_link', $object);
$output .= ')';
return $output;
}
Database Schema
---------------
If the automatic creation of the database tables was unsuccessful you can try creating the tables by hand using the following SQL:
CREATE TABLE `buddylist` (
`uid` int(10) unsigned NOT NULL default '0',
`buddy` int(10) unsigned NOT NULL default '0',
`timestamp` int(11) NOT NULL default '0',
`received` tinyint(1) NOT NULL default '0',
UNIQUE KEY `uid-buddy-label` (`uid`,`buddy`),
KEY `uid` (`uid`)
) TYPE=MyISAM /*!40100 DEFAULT CHARACTER SET utf8 */;
--
-- Table structure for table `buddylist_buddy_group`
--
CREATE TABLE `buddylist_buddy_group` (
`uid` int(11) NOT NULL default '0',
`buddy` int(11) NOT NULL default '0',
`label_id` int(11) NOT NULL default '0',
PRIMARY KEY (`uid`,`buddy`,`label_id`)
) TYPE=MyISAM /*!40100 DEFAULT CHARACTER SET utf8 */;
--
-- Table structure for table `buddylist_groups`
--
CREATE TABLE `buddylist_groups` (
`uid` int(11) NOT NULL default '0',
`label_id` int(11) NOT NULL default '0',
`label` varchar(255) NOT NULL default '',
`visible` tinyint(1) NOT NULL default '0',
PRIMARY KEY (`uid`,`label_id`)
) TYPE=MyISAM /*!40100 DEFAULT CHARACTER SET utf8 */;
Credits
-------
Written by Adrian Rossouw.
Thanks to Ratko Kovacina for the comments/debugging info
Browsing improvements by Doug Sikora
Maintainer: Robert Douglass
Status: maintained (Feb. 2006)
TODO
----
1. PGSQL schema (see buddylist.install, buddylist_install())
2. Rework texts so that one is not stuck with "buddy" but could choose "contact", for example
3. Make a workflow whereby a buddy request is sent to the buddy for confirmation which is required before the buddy can be added.
4. Make the notification that someone added you to their buddylist use the privatemsg module, if available.
5. Consider possible Views module integration.
\ No newline at end of file
This diff is collapsed.
......@@ -6,20 +6,20 @@
* @file
* Add access control to nodes based on buddygroups
*/
/**
* Implementation of hook_help().
*/
*/
function buddylist_access_help($section) {
switch ($section) {
case 'admin/modules#description':
return t('node access control by buddy group');
}
}
function buddylist_access_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) {
global $user;
switch ($op) {
case 'load':
// nothing yet
......@@ -36,10 +36,13 @@
while ($row = db_fetch_object($result)) {
$edit['buddylist_groups'][] = substr($row->realm, 9);
}
$output = buddylist_groups_select($node->uid, t('Optional. Restrict access to this post to members of these groups.'), $edit);
$output .= form_hidden('buddylist_groups_uid', $node->uid);
$form = buddylist_groups_select($node->uid, t('Optional. Restrict access to this post to members of these groups.'), $edit);
$form['buddylist_groups_uid'] = array(
'#type' => 'hidden',
'#value' => $node->uid
);
}
return $output;
return $form;
}
break;
case 'insert':
......@@ -61,7 +64,7 @@
foreach ($node->buddylist_groups as $key => $label) {
$sql = "INSERT INTO {node_access} (nid, realm, gid, grant_view) VALUES (%d, '%s', %d, %d)";
db_query($sql, $node->nid, "buddyof||$label", $node->buddylist_groups_uid, 1);
}
}
}
}
else {
......@@ -70,12 +73,13 @@
db_query($sql, $node->nid);
}
}
// realm = buddyof||$label
// we use a gid=$node->uid so that all access restrictions become moot during a node author change
function buddylist_access_node_grants($account, $op) {
if ($op == 'view') {
$sql = "SELECT b.uid, label FROM {buddylist} b INNER JOIN {users} u ON b.uid = u.uid WHERE b.buddy = %d";
// !!! - query is broken
$sql = 'SELECT b.uid, g.label FROM {buddylist} b, {buddylist_groups} g INNER JOIN {users} u ON b.uid = u.uid WHERE b.buddy = %d';
$result = db_query($sql, $account->uid);
while ($row = db_fetch_object($result)) {
$grants["buddyof||$row->label"][] = $row->uid;
......@@ -85,7 +89,7 @@
return $grants;
}
}
function buddylist_access_settings() {
$op = $_POST['op'];
drupal_set_title(t('Buddylist access configuration'));
......@@ -95,13 +99,21 @@
$status = t('enabled');
$btn_text = t('Disable');
}
$group = t('Buddylist_access access control is currently') . ' ' . theme('placeholder', $status). '.<br />';
$group .= form_button($btn_text). '<br />';
$output = form_group(t('Module status'), $group, t('After enabling this module via the module settings page or before disabling this module, use the above button to properly configure your node_access table.'));
$form['module_status'] = array(
'#type' => 'fieldset',
'#title' => t('Module status'),
'#prefix' => t('Buddylist_access access control is currently') . ' ' . theme('placeholder', $status). '.<br />',
'#description' => t('After enabling this module via the module settings page or before disabling this module, use the above button to properly configure your node_access table.')
);
$form['module_status'] = array(
'#type' => 'button',
'#value' => $btn_text,
'#suffix' => '<br />'
);
if ($op) {
if ($op == t('Enable')) {
_buddylist_access_update_db(TRUE);
_buddylist_access_update_db(TRUE);
variable_set('buddylist_access_enabled', 1);
}
elseif ($op == t('Disable')) {
......@@ -110,9 +122,9 @@
}
drupal_goto('admin/settings/buddylist_access');
}
return $output;
return $form;
}
/**
* Update the node_access table when a user enables/disables the module in the
* settings page. Because Drupal does not, at this
......@@ -157,4 +169,3 @@ function _buddylist_access_update_db($enable) {
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment