im_users_in_group db group_id current_user_id { description " " } { add_admin_links "0" } { return_url " " } { limit_to_users_in_group_id " " } { dont_allow_users_in_group_id " " } { link_type " " } { also_add_to_group_id " " }What it does:
Returns an html formatted list of all the users in the specified group. Includes optional links to add people, add/remove yourself, and spam Required Arguments: ------------------- - db: database handle - group_id: Group we're interested in. We'll display the users in this group - current_user_id: The user_id of the person viewing the page that called this function. This is used to add links like "Add yourself"... Optional Arguments: ------------------- - description: A description of the group. We use pass this to the spam function for UI - add_admin_links: Boolean. If 1, we add links to add/email people. - return_url: Where to go after we do something like add a user - limit_to_users_in_group_id: Only shows users who belong to group_id and who are also members of the group specified in limit_to_users_in_group_id. For example, if group_id is an intranet project, and limit_to_users_group_id is the group_id of the employees group, we only display users who are members of both the employees and this project groups - dont_allow_users_in_group_id: Similar to limit_to_users_in_group_id, but says that if a user belongs to the group_id specified by dont_allow_users_in_group_id, then don't display that user. - link_type: if set to "email_only" then the links returned have no html tags - also_add_to_group_id: If we're adding users to a group, we might also want to add them to another group at the same time. If you set also _add_to_group_id to a group_id, the user will be added first to group_id, then to also_add_to_group_id. Note that adding the person to both groups is NOT atomic. Notes: ------------------- This function has quickly grown out-of-hand with all the additional flags needed. Originally, it seemed like a good idea to encapsulate the admin functions for intranet projects/customers/etc. in one piece of reusable code. However, it would be more useful in the future to create separate functions for each category of group in the intranet, and to use ad_proc to allow for cleaner extension.Defined in: /web/philip/tcl/intranet-defs.tcl
Source code:
set html "" if { [empty_string_p $limit_to_users_in_group_id] } { set limit_to_group_id_sql "" } else { set limit_to_group_id_sql "and exists (select 1 from user_group_map map2, user_groups ug where map2.group_id = ug.group_id and map2.user_id = users.user_id and (map2.group_id = $limit_to_users_in_group_id or ug.parent_group_id = $limit_to_users_in_group_id))" } if { [empty_string_p $dont_allow_users_in_group_id] } { set dont_allow_sql "" } else { set dont_allow_sql "and not exists (select 1 from user_group_map map2, user_groups ug where map2.group_id = ug.group_id and map2.user_id = users.user_id and (map2.group_id = $dont_allow_users_in_group_id or ug.parent_group_id = $dont_allow_users_in_group_id))" } # We need a "distinct" because there can be more than one # mapping between a user and a group, one for each role. # set sql_post_select "from users_active users, user_group_map map where map.user_id = users.user_id and map.group_id = $group_id $limit_to_group_id_sql $dont_allow_sql order by lower(users.last_name)" set sql_query "select distinct users.user_id, users.email, users.first_names || ' ' || users.last_name as name, users.last_name $sql_post_select" set selection [ns_db select $db $sql_query] set found 0 set count 0 while { [ns_db getrow $db $selection] } { incr count set_variables_after_query if { $current_user_id == $user_id } { set found 1 } if { $link_type == "email_only" } { append html " <li><a href=\"mailto:$email\">$name</a>\n" } else { append html " <li><a href=../users/view?[export_url_vars user_id]>$name</a>" } if { $add_admin_links } { append html " (<a href=[im_url_stub]/member-remove-2?[export_url_vars user_id group_id return_url]>remove</a>)" } append html "\n" } if { [empty_string_p $html] } { set html " <li><i>none</i>\n" } if { $add_admin_links } { if { $current_user_id > 0 } { append html " <p><a href=[im_url_stub]/member-add?role=member&[export_url_vars group_id return_url limit_to_users_in_group_id also_add_to_group_id]>Add a person</a>" if { $found } { append html " <br><a href=[im_url_stub]/member-remove-2?[export_url_vars group_id return_url limit_to_users_in_group_id]&user_id=$current_user_id>Remove yourself</a>" } else { # We might not want to offer this user the chance to add him/herself (based on the # group_id set by limit_to_users_in_group_id) if { [empty_string_p $dont_allow_users_in_group_id] } { set offer_link 1 } else { set offer_link [database_to_tcl_string $db "select decode(decode(count(1),0,0,1),1,0,1) from user_group_map ugm, user_groups ug where ugm.group_id = ug.group_id and ugm.user_id=$current_user_id and (ugm.group_id=$dont_allow_users_in_group_id or ug.parent_group_id=$dont_allow_users_in_group_id)"] } if { $offer_link } { append html " <br><a href=[im_url_stub]/member-add-3?[export_url_vars group_id limit_to_users_in_group_id return_url also_add_to_group_id]&user_id_from_search=$current_user_id&role=administrator>Add yourself</a>" } } if { $count > 0 } { # set sql_post_select [im_reduce_spaces $sql_post_select] set group_id_list "${group_id},$limit_to_users_in_group_id" append html " <br><a href=[im_url_stub]/spam/index?[export_url_vars group_id_list description return_url]>Spam people</a>" # If we have subprojects, then provide option to spam them set subgroup_ids [database_to_tcl_list $db "select group_id from im_projects where parent_id = $group_id"] if { [llength $subgroup_ids] > 0 } { set group_id_list "${group_id},[join $subgroup_ids ","]" append html " <br><a href=[im_url_stub]/spam/index?[export_url_vars group_id_list description return_url]&all_or_any=any>Spam people in subprojects</a>" } } } } return $html