File:  [LON-CAPA] / loncom / interface / lonpickuser.pm
Revision 1.5: download - view: text, annotated - select for diffs
Wed Jan 5 18:39:38 2011 UTC (13 years, 3 months ago) by raeburn
Branches: MAIN
CVS tags: version_2_11_1, version_2_11_0_RC3, version_2_11_0_RC2, version_2_11_0_RC1, version_2_11_0, version_2_10_X, version_2_10_1, version_2_10_0_RC2, version_2_10_0, loncapaMITrelate_1, language_hyphenation_merge, language_hyphenation, HEAD, BZ4492-merge, BZ4492-feature_horizontal_radioresponse
- Additional arg - $context - for loncommon::user_picker().
  - Required domain for new user when requesting course creation is course's domain
    instead of domain of current role.

    1: # The LearningOnline Network
    2: # Search for a user
    3: #
    4: # $Id: lonpickuser.pm,v 1.5 2011/01/05 18:39:38 raeburn Exp $
    5: #
    6: # Copyright Michigan State University Board of Trustees
    7: #
    8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
    9: #
   10: # LON-CAPA is free software; you can redistribute it and/or modify
   11: # it under the terms of the GNU General Public License as published by
   12: # the Free Software Foundation; either version 2 of the License, or
   13: # (at your option) any later version.
   14: #
   15: # LON-CAPA is distributed in the hope that it will be useful,
   16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
   17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   18: # GNU General Public License for more details.
   19: #
   20: # You should have received a copy of the GNU General Public License
   21: # along with LON-CAPA; if not, write to the Free Software
   22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   23: #
   24: # /home/httpd/html/adm/gpl.txt
   25: #
   26: # http://www.lon-capa.org/
   27: #
   28: ###
   29: 
   30: =head1 NAME
   31: 
   32: Apache::lonpickuser.pm
   33: 
   34: =head1 SYNOPSIS
   35: 
   36: Allows users to search by username, lastname, or lastname,firstname in LON-CAPA,
   37: and also in an institutional directory (if enabled).
   38: 
   39: This is part of the LearningOnline Network with CAPA project
   40: described at http://www.lon-capa.org.
   41: 
   42: =head1 SUBROUTINES
   43: 
   44: =over
   45: 
   46: =item handler()
   47: 
   48: =item gochoose_javascript()
   49:  
   50: =back
   51: 
   52: =cut
   53: 
   54: package Apache::lonpickuser;
   55: 
   56: use strict;
   57: use Apache::Constants qw(:common :http);
   58: use Apache::lonnet;
   59: use Apache::loncommon;
   60: use Apache::lonlocal;
   61: use Apache::lonuserutils;
   62: use Apache::loncreateuser;
   63: use LONCAPA;
   64: 
   65: sub handler {
   66:     my ($r) = @_;
   67:     &Apache::loncommon::content_type($r,'text/html');
   68:     $r->send_http_header;
   69:     return OK if $r->header_only;
   70: 
   71:     # Get parameters from query string
   72:     &Apache::loncommon::get_unprocessed_cgi
   73:         ($ENV{'QUERY_STRING'},['srchdom','form','udomelement','unameelement','ulastelement',
   74:                                'ufirstelement','uemailelement','hideudomelement','coursedom','caller']);
   75:     my $js;
   76: 
   77:     if (($env{'form.phase'} eq 'get_user_info') || 
   78:         ($env{'form.phase'} eq 'store_newuser')) {
   79:         $js = &gochoose_javascript();
   80:     } elsif ($env{'form.phase'} eq 'define_newuser') {
   81:         $js = <<"ENDSP";
   82: <script type="text/javascript">
   83: // <![CDATA[
   84: function setphase(caller) {
   85:     document.newuserinfo.phase.value = caller;
   86:     document.newuserinfo.submit();
   87:     return;
   88: }
   89: // ]]>
   90: </script>
   91: ENDSP
   92:     } elsif ($env{'form.caller'} eq 'checkusername') {
   93:         $js = <<"ENDCHK";
   94: <script type="text/javascript">
   95: // <![CDATA[
   96: function checkUser() {
   97:     var uname = opener.document.$env{'form.form'}.$env{'form.unameelement'}.value;
   98:     var udom;
   99:     var slct=opener.document.$env{'form.form'}.$env{'form.udomelement'};
  100:     if (slct.options == undefined) {
  101:         udom = opener.document.$env{'form.form'}.$env{'form.udomelement'}.value;
  102:     } else {
  103:         udom = slct.options[slct.selectedIndex].value;
  104:     }
  105:     if (uname != '') {
  106:         document.userpicker.srchterm.value = uname;
  107:         document.userpicker.srchdomain.value = udom;
  108:     }
  109:     document.userpicker.submit();
  110: }
  111: // ]]>
  112: </script>
  113: ENDCHK
  114:     } elsif ($env{'form.phase'} eq '') {
  115:         $js = <<"ENDSET";
  116: <script type="text/javascript">
  117: // <![CDATA[
  118: function setUserSearch() {
  119:     var uname = opener.document.$env{'form.form'}.$env{'form.unameelement'}.value;
  120:     var udom;
  121:     var slct=opener.document.$env{'form.form'}.$env{'form.udomelement'};
  122:     if (slct.options == undefined) {
  123:         udom = opener.document.$env{'form.form'}.$env{'form.udomelement'}.value;
  124:     } else {
  125:         udom = slct.options[slct.selectedIndex].value;
  126:     }
  127:     if (uname != '') {
  128:         document.userpicker.srchterm.value = uname;
  129:         var seldom = document.userpicker.srchdomain;
  130:         if (seldom.options != undefined) {
  131:             var i;
  132:             for (i=0;i<seldom.length;i++) {
  133:                 if (seldom.options[i].value==udom) { seldom.selectedIndex=i; }
  134:             }
  135:         }
  136:         var selby = document.userpicker.srchby;
  137:         if (selby.options != undefined) {
  138:             var i;
  139:             for (i=0;i<selby.length;i++) {
  140:                 if (selby.options[i].value=="uname") { selby.selectedIndex=i; }
  141:             }
  142:         }
  143:         var seltype = document.userpicker.srchtype;
  144:         if (seltype.options != undefined) {
  145:             var i;
  146:             for (i=0;i<seltype.length;i++) {
  147:                 if (seltype.options[i].value=="exact") { seltype.selectedIndex=i; }
  148:             }
  149:         }
  150:         var selin = document.userpicker.srchin;
  151:         if (selin.options != undefined) {
  152:             var i;
  153:             for (i=0;i<selin.length;i++) {
  154:                 if (selin.options[i].value=="dom") { selin.selectedIndex=i; }
  155:             }
  156:         }
  157:     }
  158:     return;
  159: }
  160: // ]]>
  161: </script>
  162: ENDSET
  163:     }
  164:     my $startargs = {'no_nav_bar'  => 1, };
  165:     if ($env{'form.phase'} eq 'store_newuser') {
  166:         my $uname = $env{'form.srchterm'};
  167:         my $udom = $env{'form.srchdomain'};
  168:         my $newfirst = $env{'form.newfirst'};
  169:         my $newlast = $env{'form.newlast'};
  170:         my $newemail = $env{'form.newemail'};
  171:         $startargs->{'add_entries'} = { onload => 'javascript:gochoose('."'$uname','$udom','$newfirst','$newlast','$newemail'".');' };
  172:     } elsif ($env{'form.caller'} eq 'checkusername') {
  173:         $startargs->{'add_entries'} = { onload => 'javascript:checkUser();' };
  174:     } elsif ($env{'form.phase'} eq '') {
  175:         $startargs->{'add_entries'} = { onload => 'javascript:setUserSearch();' };
  176:     }
  177:     $r->print(&Apache::loncommon::start_page('Selecting course personnel',
  178:                                              $js,$startargs));
  179:     if ($env{'form.caller'} eq 'checkusername') {
  180:         $r->print(&check_user_form().
  181:                   &Apache::loncommon::end_page());
  182:         return OK;
  183:     }
  184:     my %toset = (
  185:                   uname   => 'unameelement',
  186:                   udom    => 'udomelement',
  187:                   first   => 'ufirstelement',
  188:                   lastn   => 'ulastelement',
  189:                   email   => 'uemailelement',
  190:                   hidedom => 'hideudomelement',
  191:                 );
  192: 
  193:     my @search = ('srchterm','srchby','srchin','srchtype','srchdomain');
  194:     my %srch;
  195:     foreach my $item (@search) {
  196:         $srch{$item} = $env{'form.'.$item};
  197:     }
  198:     my $forcenewuser;
  199:     my $context = 'requestcrs';
  200:     my $usertype;
  201:     if (($srch{'srchin'} eq 'dom') &&
  202:         ($srch{'srchby'} eq 'uname') &&
  203:         ($srch{'srchtype'} eq 'exact') &&
  204:         ($srch{'srchdomain'} ne '') &&
  205:         ($srch{'srchterm'} ne '')) {
  206:         my (%curr_rules,%got_rules);
  207:         my ($rules,$ruleorder) =
  208:             &Apache::lonnet::inst_userrules($srch{'srchdomain'},'username');
  209:         $usertype = &Apache::lonuserutils::check_usertype($srch{'srchdomain'},
  210:                                                           $srch{'srchterm'},$rules,
  211:                                                           \%curr_rules,\%got_rules);
  212:     }
  213: 
  214:     my $dom = $env{'form.coursedom'};
  215: 
  216:     my $cancreate =
  217:         &Apache::lonuserutils::can_create_user($dom,$context,$usertype);
  218:     my $userpicker =
  219:        &Apache::loncommon::user_picker($dom,\%srch,$forcenewuser,
  220:                                        'document.userpicker',$cancreate,
  221:                                        $usertype,$context);
  222:     my $srchbutton = &mt('Search');
  223: 
  224:     my $headertext = &mt('Search for a user to add to course personnel');  
  225:     my $opener_elems = '<input type="hidden" name="form" value="'.
  226:                        $env{'form.form'}.'" />'."\n".
  227:                        '<input type="hidden" name="coursedom" value="'.
  228:                        $env{'form.coursedom'}.'" />'."\n".
  229:                        &set_opener_elems();
  230:     unless ($env{'form.phase'} eq 'define_newuser') { 
  231:         $r->print(<<"ENDBLOCK");
  232: <h3>$headertext</h3>
  233: <form action="/adm/pickuser" method="post" name="userpicker">
  234: $opener_elems
  235: <input type="hidden" name="phase" value="get_user_info" />
  236: $userpicker
  237: <input name="userrole" type="button" value="$srchbutton" onclick="javascript:validateEntry(document.userpicker)" />
  238: </form>
  239: ENDBLOCK
  240:     }
  241:     if (($env{'form.phase'} eq 'get_user_info') && ($env{'form.srchterm'} ne '')) {
  242:         $r->print('<hr /><div>'.&mt('Searching ...').'</div>');
  243:         $r->rflush();
  244:         my ($currstate,$response,$forcenewuser,$results) = 
  245:             &Apache::loncreateuser::user_search_result($context,\%srch);
  246:         if (($currstate eq 'select') || ($currstate eq 'modify')) {
  247:             &Apache::loncreateuser::print_user_selection_page($r,$response,\%srch,$results,
  248:                                                               \@search,$context,$opener_elems);
  249:         } else {
  250:             $r->print('<div>'.$response.'</div>');
  251:             if ($forcenewuser) {
  252:                 if ($srch{'srchby'} eq 'uname' && 
  253:                     $srch{'srchtype'} eq 'exact' && 
  254:                     $srch{'srchin'} eq 'dom' && 
  255:                     $srch{'srchdomain'} eq $env{'form.coursedom'}) {
  256:                     if ($cancreate) {
  257:                         $r->print("\n".'<div><form name="newuser" '.
  258:                                   'method="post" action="/adm/pickuser">');
  259:                         foreach my $item (keys(%srch)) {
  260:                             $r->print('<input type="hidden" name="'.$item.'"'.
  261:                                       ' value="'.$srch{$item}.'" />'."\n");
  262:                         }
  263:                         $r->print('
  264: <input type="hidden" name="phase" value="define_newuser">
  265: <input type="submit" name="forcenew" value="'.
  266: &HTML::Entities::encode(&mt('Make new user "[_1]"',$srch{'srchterm'}),'<>&"').'" />'."\n".
  267: $opener_elems.'
  268: </form></div>');
  269:                     } else {
  270:                         my $helplink = 'javascript:helpMenu('."'display'".')';
  271:                         my %usertypetext = 
  272:                             &Apache::lonlocal::texthash(
  273:                               official   => 'You are not authorized to create new institutional users in this domain.',
  274:                               unofficial => 'You are not authorized to create new non-institutional users in this domain.',
  275:                         );
  276:                         $r->print('<div class="LC_warning">'.
  277:                                   $usertypetext{$usertype}.' '.
  278:                                   &mt('Please contact the [_1]helpdesk[_2] for assistance.','<a href="'.$helplink.'">','</a>').'</div>');
  279: 
  280:                     }
  281:                 }
  282:             }
  283:         }
  284:     }
  285:     if ($env{'form.phase'} eq 'define_newuser') {
  286:         $r->print('<h3>'.&mt('Define new user').' '.$srch{'srchterm'}.':'.
  287:                   $srch{'srchdomain'}.'</h3>'."\n".'<div>'.
  288:                   '<form name="newuserinfo" method="post" action="/adm/pickuser">'."\n".
  289:                   '<input type="hidden" name="phase" value="" />'."\n".
  290:                   $opener_elems.
  291:                   &Apache::lonhtmlcommon::start_pick_box()."\n".
  292:                   &Apache::lonhtmlcommon::row_title(&mt('First Name')).
  293:                   '<input type="text" name="newfirst" value="" size="15" />'.
  294:                   &Apache::lonhtmlcommon::row_closure()."\n".
  295:                   &Apache::lonhtmlcommon::row_title(&mt('Last Name')).
  296:                   '<input type="text" name="newlast" value="" size="25" />'
  297: .
  298:                   &Apache::lonhtmlcommon::row_closure()."\n".
  299:                   &Apache::lonhtmlcommon::row_title(&mt('E-mail Address')).
  300:                   '<input type="text" name="newemail" value="" size="25" />'
  301: .
  302:                   &Apache::lonhtmlcommon::row_closure(1)."\n".
  303:                   &Apache::lonhtmlcommon::end_pick_box());
  304:         foreach my $item (keys(%srch)) {
  305:             $r->print('<input type="hidden" name="'.$item.'"'.
  306:                       ' value="'.$srch{$item}.'" />'."\n");
  307:         }
  308:         $r->print('<br /><input type="button" name="cancelnew" value="'.
  309:                   &mt('Cancel').'" onclick="javascript:setphase('.
  310:                   "'get_user_info'".');" />'."\n".
  311:                   '<input type="button" name="definenew" value="'.
  312:                   &mt('Save').'" onclick="javascript:setphase('.
  313:                   "'store_newuser'".');" /></form></div>');
  314:     }
  315:     $r->print(&Apache::loncommon::end_page());
  316:     return OK;
  317: }
  318: 
  319: sub gochoose_javascript {
  320:     return <<"ENDGC"; 
  321: <script type="text/javascript">
  322: // <![CDATA[
  323: function gochoose(uname,udom,ufirst,ulast,uemail) {
  324:     opener.document.$env{'form.form'}.$env{'form.unameelement'}.value=uname;
  325:     opener.document.$env{'form.form'}.$env{'form.ufirstelement'}.value=ufirst;
  326:     opener.document.$env{'form.form'}.$env{'form.ulastelement'}.value=ulast;
  327:     opener.document.$env{'form.form'}.$env{'form.uemailelement'}.value=uemail;
  328: 
  329:     var slct=opener.document.$env{'form.form'}.$env{'form.udomelement'};
  330:     if (slct.options == undefined) {
  331:         opener.document.$env{'form.form'}.$env{'form.udomelement'}.value=udom;
  332:     }
  333:     else {
  334:         var i;
  335:         for (i=0;i<slct.length;i++) {
  336:             if (slct.options[i].value==udom) { slct.selectedIndex=i; }
  337:         }
  338:     }
  339:     opener.document.$env{'form.form'}.$env{'form.hideudomelement'}.value=udom;
  340:     self.close();
  341: }
  342: // ]]>
  343: </script>
  344: 
  345: ENDGC
  346: }
  347: 
  348: sub check_user_form {
  349:     return '
  350: <form action="/adm/pickuser" method="post" name="userpicker">
  351: <input type="hidden" name="form" value="'.$env{'form.form'}.'" />
  352: <input type="hidden" name="coursedom" value="'.$env{'form.coursedom'}.'" />'."\n".
  353:                  &set_opener_elems().'
  354: <input type="hidden" name="srchby" value="uname" />
  355: <input type="hidden" name="srchin" value="dom" />
  356: <input type="hidden" name="srchterm" value="" />
  357: <input type="hidden" name="srchdomain" value="" />
  358: <input type="hidden" name="srchtype" value="exact" />
  359: <input type="hidden" name="phase" value="get_user_info" />
  360: </form>'."\n";
  361: }
  362: 
  363: sub set_opener_elems {
  364:     my %toset = (
  365:                   uname   => 'unameelement',
  366:                   udom    => 'udomelement',
  367:                   first   => 'ufirstelement',
  368:                   lastn   => 'ulastelement',
  369:                   email   => 'uemailelement',
  370:                   hidedom => 'hideudomelement',
  371:                 );
  372:     my $output;
  373:     foreach my $item (keys(%toset)) {
  374:         if (exists($env{'form.'.$toset{$item}})) {
  375:             $output .= '<input type="hidden" name="'.$toset{$item}.'" value="'.$env{'form.'.$toset{$item}}.'" />'."\n";
  376:         }
  377:     }
  378:     return $output;
  379: }
  380: 
  381: 1;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>