search.tcl
Reusable page for searching for a user by email or last_name. Returns to "target" with user_id_from_search, first_names_from_search, ast_name_from_search, and email_from_search, and passing along all form variables listed in "passthrough".
- Location:
- /packages/acs-admin/www/users/search.tcl
- Author:
- Jin Choi <jsc@arsdigita.com>
- CVS ID:
$Id: search.tcl,v 1.10.2.6 2023/10/06 12:09:20 gustafn Exp $
Related Files
- packages/acs-admin/www/users/search.xql
- packages/acs-admin/www/users/search.tcl
- packages/acs-admin/www/users/search.adp
[ hide source ] | [ make this the default ]
File Contents
ad_page_contract { Reusable page for searching for a user by email or last_name. Returns to "target" with user_id_from_search, first_names_from_search, ast_name_from_search, and email_from_search, and passing along all form variables listed in "passthrough". @cvs-id $Id: search.tcl,v 1.10.2.6 2023/10/06 12:09:20 gustafn Exp $ @param email search string @param last_name search string @param keyword For looking through both email and last_name (optional) @param target URL to return to @param passthrough Form variables to pass along from caller @param limit_to_users_in_group_id Limits search to users in the specified group id. This can be a comma separated list to allow searches within multiple groups. (optional) @param limit_to_user_id This is useful is you don't want to show a list of user_ids. This could be a comma separated list. (optional) @param from_user_id is used if you want to merge the user_id with user_id_from_search (optional) @author Jin Choi (jsc@arsdigita.com) } { {email ""} {last_name ""} keyword:optional target {passthrough ""} {limit_to_users_in_group_id:naturalnum ""} {only_authorized_p:boolean,notnull 1} {limit_to_user_id:naturalnum,multiple ""} {from_user_id:naturalnum ""} } -properties { group_name:onevalue search_type:onevalue keyword:onevalue email:onevalue last_name:onevalue only_authorized_p:onevalue export_authorize:onevalue passthrough_parameters:onevalue context:onevalue } # Check input. set exception_count 0 set exception_text "" set context [list [list "./" "Users"] "Search"] if {[info exists keyword]} { # this is an administrator if { $keyword eq "" } { incr exception_count append exception_text "<li>You forgot to type a search string!\n" } } else { # from one of the user pages if { $email eq "" && $last_name eq "" } { incr exception_count append exception_text "<li>You must specify either an email address or last name to search for.\n" } if { $email ne "" && $last_name ne "" } { incr exception_count append exception_text "<li>You can only specify either email or last name, not both.\n" } if { ![info exists target] || $target eq "" } { incr exception_count append exception_text "<li>Target was not specified. This shouldn't have happened, please contact the <a href=\"mailto:[ad_host_administrator]\">administrator</a> and let them know what happened.\n" } } if { $exception_count != 0 } { ad_return_complaint $exception_count $exception_text return } #### # Input okay. Now start building the SQL set where_clause [list] if { [info exists keyword] } { set search_type "keyword" set sql_keyword "%[string tolower $keyword]%" lappend where_clause "(email like :sql_keyword or lower(first_names || ' ' || last_name) like :sql_keyword)" } elseif { $email ne "" } { set search_type "email" set sql_email "%[string tolower $email]%" lappend where_clause "email like :sql_email" } else { set search_type "last" set sql_last_name "%[string tolower $last_name]%" lappend where_clause "lower(last_name) like :sql_last_name" } if { $only_authorized_p } { lappend where_clause {member_state = 'approved'} } if { ![info exists passthrough] } { set passthrough_parameters "" } else { set passthrough_parameters [export_vars -formvars $passthrough] } if { [llength $limit_to_user_id] > 0} { lappend where_clause "cc_users.user_id not in ([ns_dbquotelist $limit_to_user_id])" } if { $limit_to_users_in_group_id ne "" } { set query [subst { select distinct first_names, last_name, email, member_state, email_verified_p, cu.user_id from cc_users cu, group_member_map gm, membership_rels mr where cu.user_id = gm.member_id and gm.rel_id = mr.rel_id and gm.group_id = :limit_to_users_in_group_id and [join $where_clause "\nand "] }] } else { set query [subst { select user_id, email_verified_p, first_names, last_name, email, member_state from cc_users where [join $where_clause "\nand "] }] } set i 0 set user_items "" set rowcount 0 db_foreach user_search_admin $query { incr rowcount set user_id_from_search $user_id set first_names_from_search $first_names set last_name_from_search $last_name set email_from_search $email if { $from_user_id eq "" } { set user_search:[set rowcount](user_id) $user_id } else { set user_search:[set rowcount](user_id) $from_user_id } set user_search:[set rowcount](first_names) $first_names set user_search:[set rowcount](last_name) $last_name set user_search:[set rowcount](email) $email set user_search:[set rowcount](export_vars) [export_vars {user_id_from_search first_names_from_search last_name_from_search email_from_search}] set user_search:[set rowcount](member_state) $member_state if { $member_state ne "approved" } { set user_search:[set rowcount](user_finite_state_links) [join [ad_registration_finite_state_machine_admin_links $member_state $email_verified_p $user_id_from_search [export_vars -base search {email last_name keyword target passthrough limit_to_users_in_group_id only_authorized_p}]] " | "] } else { set user_search:[set rowcount](user_finite_state_links) "" } } set user_search:rowcount $rowcount # We are limiting the search to one group - display that group's name if { $limit_to_users_in_group_id ne "" && ![regexp {[^0-9]} $limit_to_users_in_group_id] } { set group_name [db_string user_group_name_from_id { select group_name from user_groups where group_id = :limit_to_users_in_group_id }] set title "User search in $group_name" } else { set group_name "" set title "User search" } set export_authorize [export_vars -entire_form -exclude {only_authorized_p}] ad_return_template # Local variables: # mode: tcl # tcl-indent-level: 4 # indent-tabs-mode: nil # End: