--- loncom/interface/lonrequestcourse.pm 2013/12/27 14:34:52 1.72 +++ loncom/interface/lonrequestcourse.pm 2014/01/03 18:39:51 1.73 @@ -1,7 +1,7 @@ # The LearningOnline Network # Request a course # -# $Id: lonrequestcourse.pm,v 1.72 2013/12/27 14:34:52 raeburn Exp $ +# $Id: lonrequestcourse.pm,v 1.73 2014/01/03 18:39:51 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -128,7 +128,7 @@ sub handler { } &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['action','showdom','cnum','state','crstype','queue']); + ['action','showdom','cnum','state','crstype','queue','tabs']); &Apache::lonhtmlcommon::clear_breadcrumbs(); my $dom = &get_course_dom(); my $action = $env{'form.action'}; @@ -155,16 +155,31 @@ sub handler { } if ($canreq) { - if ((scalar(keys(%can_request)) == 1) && ($can_request{'textbook'})) { + if (($env{'form.crstype'} eq 'textbook') || + (scalar(keys(%can_request)) == 1) && ($can_request{'textbook'})) { my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom); if ($action eq 'log') { + my $usetabs; + if ((scalar(keys(%can_request)) == 1) && ($can_request{'textbook'})) { + $usetabs = 1; + } elsif ($env{'form.tabs'} eq 'on') { + $usetabs = 1; + } &Apache::lonhtmlcommon::add_breadcrumb({text=>'Course Request'}); my $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests'); - &print_request_logs($r,$dom,undef,undef,$crumb); + &print_request_logs($r,$dom,undef,undef,$crumb,$usetabs); } elsif ($action eq 'process') { - &process_textbook_request($r,$dom,$action,\%domdefs,\%domconfig); + if ($can_request{'textbook'}) { + &process_textbook_request($r,$dom,$action,\%domdefs,\%domconfig,\%can_request); + } else { + &textbook_request_disabled($r,$dom,\%can_request); + } } else { - &print_textbook_form($r,$dom,\@incdoms,\%domdefs,$domconfig{'requestcourses'}); + if ($can_request{'textbook'}) { + &print_textbook_form($r,$dom,\@incdoms,\%domdefs,$domconfig{'requestcourses'},\%can_request); + } else { + &textbook_request_disabled($r,$dom,\%can_request); + } } return OK; } @@ -195,7 +210,7 @@ sub handler { my @invalidcrosslist; my %trail = ( - crstype => 'Request Action', + crstype => 'Pick Action', codepick => 'Category', courseinfo => 'Description', enrollment => 'Access Dates', @@ -382,7 +397,7 @@ function setPage(formname) { } ENDJS - &print_request_logs($r,$dom,$jscript,$loaditems,$crumb); + &print_request_logs($r,$dom,$jscript,$loaditems,$crumb,\%can_request); } } else { &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb,\@incdoms); @@ -1483,6 +1498,15 @@ sub print_request_form { } $r->print(&print_review($dom,\@codetitles,\%cat_titles,\%cat_order,\@code_order,'','',\@disallowed,\%disallowmsg,$instcredits). ''); + my $fullname = &Apache::loncommon::plainname($env{'user.name'}, + $env{'user.domain'}); + my $postprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'review',$env{'user.name'}, + $env{'user.domain'},$fullname,$env{'form.cdescr'}); + if (ref($postprocess) eq 'HASH') { + if ($postprocess->{'reviewweb'}) { + $r->print($postprocess->{'reviewweb'}); + } + } if ($crstype eq 'community') { $navtxt{'next'} = &mt('Submit community request'); } else { @@ -2126,6 +2150,7 @@ sub sorted_request_history { my $crstype = $history{'crstype'}; my $disposition = $history{'disposition'}; my $status = $history{'status'}; + my $uniquecode = $history{'code'}; if ($action eq 'view') { next if ((exists($history{'status'})) && ($history{'status'} eq 'created')); } else { @@ -2141,7 +2166,7 @@ sub sorted_request_history { $entry = $requestkey.':'.$crstype.':'. &escape($history{'details'}{'cdescr'}); if ($action eq 'log') { - $entry .= ':'.$lastupdate.':'; + $entry .= ':'.$uniquecode.':'.$lastupdate.':'; if ($statusinfo{$key} ne '') { $entry .= $statusinfo{$key}; } elsif ($status ne '') { @@ -2354,7 +2379,7 @@ ENDJS } sub print_request_logs { - my ($r,$dom,$jscript,$loaditems,$crumb) = @_; + my ($r,$dom,$jscript,$loaditems,$crumb,$usetabs) = @_; my $title; if ($env{'form.crstype'} eq 'community') { $title = 'Community Request Logs'; @@ -2364,6 +2389,9 @@ sub print_request_logs { $title = 'Course Request Logs'; } $r->print(&header($title,$jscript,$loaditems).$crumb); + if ($usetabs) { + &startContentScreen($r,'textbooklogs'); + } my $formname = 'requestcrs'; $r->print('
'."\n". ''."\n". @@ -2408,6 +2436,28 @@ sub print_request_logs { if (($curr{'crstype'} eq 'official') || ($curr{'crstype'} eq 'any')) { $tablehdr .= ''.&mt('Institutional Code').''; } + my $showuniquecode; + my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom); + if (($curr{'status'} eq 'any') || ($curr{'status'} eq 'created')) { + if (ref($domconfig{'requestcourses'}) eq 'HASH') { + if (ref($domconfig{'requestcourses'}{'uniquecode'}) eq 'HASH') { + if ($curr{'crstype'} eq 'any') { + my @types = qw(official unofficial community textbook); + foreach my $type (@types) { + if ($domconfig{'requestcourses'}{'uniquecode'}{$type}) { + $showuniquecode = 1; + last; + } + } + } elsif ($domconfig{'requestcourses'}{'uniquecode'}{$curr{'crstype'}}) { + $showuniquecode = 1; + } + } + } + } + if ($showuniquecode) { + $tablehdr .= ''.&mt('Unique Code').''; + } if ($curr{'status'} eq 'any') { $tablehdr .= ''.&mt('Status').''; } elsif ($curr{'status'} eq 'created') { @@ -2445,7 +2495,7 @@ sub print_request_logs { my $showtime = &Apache::lonlocal::locallocaltime($item); if (ref($queue_by_date{$item}) eq 'ARRAY') { foreach my $request (sort(@{$queue_by_date{$item}})) { - my ($key,$crstype,$desc,$timestamp,$status,$instcode) = split(':',$request); + my ($key,$crstype,$desc,$uniquecode,$timestamp,$status,$instcode) = split(':',$request); my ($cdom,$cnum) = split('_',$key); my $output = &Apache::loncommon::start_data_table_row(). ''.$count.''. @@ -2471,6 +2521,13 @@ sub print_request_logs { } $output .= ''.$showinstcode.''; } + if ($showuniquecode) { + if ($status eq 'created') { + $output .= ''.$uniquecode.''; + } else { + $output .= ''.&mt('Not applicable').''; + } + } if ($curr{'status'} eq 'any') { my $statusname = &mt('Unknown status'); if (ref($statusnames) eq 'HASH') { @@ -2531,8 +2588,14 @@ ENDSCRIPT &mt('There are no records to display'). '

'); } - $r->print('
'. - &Apache::loncommon::end_page()); + if ($usetabs) { + $r->print(''); + } + $r->print(''); + if ($usetabs) { + &endContentScreen($r); + } + $r->print(&Apache::loncommon::end_page()); return; } @@ -3274,16 +3337,17 @@ sub print_request_outcome { $output = &mt('Invalid LON-CAPA course number for the new course')."\n"; return $output; } - - %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom); + $crstype = $env{'form.crstype'}; + my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom); if (ref($domconfig{'requestcourses'}) eq 'HASH') { if (ref($domconfig{'requestcourses'}{'notify'}) eq 'HASH') { $req_notifylist = $domconfig{'requestcourses'}{'notify'}{'approval'}; } - $uniquecode = $domconfig{'requestcourses'}{'uniquecode'}; + if (ref($domconfig{'requestcourses'}{'uniquecode'}) eq 'HASH') { + $uniquecode = $domconfig{'requestcourses'}{'uniquecode'}{$crstype}; + } } $now = time; - $crstype = $env{'form.crstype'}; my $ccrole = 'cc'; if ($crstype eq 'community') { $ccrole = 'co'; @@ -3578,7 +3642,32 @@ sub process_request { } $reqhash{'disposition'} = $disposition; $reqstatus = $disposition; - my ($modified,$queued); + my ($modified,$queued,$coursedesc,%customitems); + unless ($disposition eq 'rejected') { + if (ref($details) eq 'HASH') { + $coursedesc = $details->{'cdescr'}; + } + my $fullname = &Apache::loncommon::plainname($env{'user.name'}, + $env{'user.domain'}); + my $inprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'process',$env{'user.name'}, + $env{'user.domain'},$fullname,$coursedesc); + if (ref($inprocess) eq 'HASH') { + if (ref($inprocess->{'formitems'}) eq 'HASH') { + foreach my $key (keys(%{$inprocess->{'formitems'}})) { + if ($inprocess->{'formitems'}->{$key} eq 'multiple') { + if (exists($env{'form.'.$key})) { + @{$customitems{$key}} = &Apache::loncommon::get_env_multiple($env{'form.'.$key}); + } + } else { + if (exists($env{'form.'.$key})) { + $customitems{$key} = $env{'form.'.$key}; + $reqhash{'custom'}{$key} = $customitems{$key}; + } + } + } + } + } + } if ($disposition eq 'rejected') { if ($crstype eq 'community') { $output = &mt('Your community request was rejected.'); @@ -3600,9 +3689,10 @@ sub process_request { foreach my $role (@roles) { $longroles{$role}=&Apache::lonnet::plaintext($role,$type); } - my $result = &Apache::loncoursequeueadmin::course_creation($dom,$cnum, - 'autocreate',$details,\$logmsg,\$newusermsg,\$addresult, - \$enrollcount,\$response,\$keysmsg,\%domdefs,\%longroles,\$code); + my ($result,$postprocess) = &Apache::loncoursequeueadmin::course_creation($dom,$cnum, + 'autocreate',$details,\$logmsg,\$newusermsg,\$addresult, + \$enrollcount,\$response,\$keysmsg,\%domdefs,\%longroles, + \$code,\%customitems); if ($result eq 'created') { $disposition = 'created'; $reqstatus = 'created'; @@ -3613,9 +3703,13 @@ sub process_request { } else { $output = '

'.&mt('Your course request has been processed and the course has been created.'); } - if ($code) { + if (($code) || ((ref($postprocess) eq 'HASH') && + (($postprocess->{'createdweb'}) || ($postprocess->{'createdmsg'})))) { $output .= ¬ification_information($disposition,$env{'user.name'}.':'.$env{'user.domain'}, - $cnum,$now,$code); + $cnum,$now,$code,$postprocess); + } + if ($code) { + $reqhash{'code'} = $code; } $output .= '
'.$role_result.'

'; $creationresult = 'created'; @@ -3633,7 +3727,7 @@ sub process_request { } } else { my $requestid = $cnum.'_'.$disposition; - my $request = { + my $request = { $requestid => { timestamp => $now, crstype => $crstype, @@ -3689,6 +3783,18 @@ sub process_request { $output .= '

'.&mt('Your course request has been updated').'

'; } $output .= ¬ification_information($disposition,$req_notifylist,$cnum,$now); + if ($disposition eq 'approval') { + my $fullname = &Apache::loncommon::plainname($env{'user.name'}, + $env{'user.domain'}); + my $postprocess = + &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'queued',$env{'user.name'}, + $env{'user.domain'},$fullname,$env{'form.cdescr'}); + if ((ref($postprocess) eq 'HASH') && + ((ref($postprocess->{'queuedmsg'}) eq 'HASH') || ($postprocess->{'queuedweb'}))) { + my $recipient = $env{'user.name'}.':'.$env{'user.domain'}; + $output .= ¬ification_information($disposition,$recipient,$cnum,$now,undef,$postprocess); + } + } } if ($validationerror ne '') { $output .= '

'.&mt('An error occurred validating your request with institutional data sources: [_1].',$validationerror).'

'; @@ -3840,7 +3946,7 @@ sub update_requestors_roles { } sub notification_information { - my ($disposition,$req_notifylist,$cnum,$now,$code) = @_; + my ($disposition,$req_notifylist,$cnum,$now,$code,$postprocess) = @_; my %emails = &Apache::loncommon::getemails(); my $address; if (($emails{'permanentemail'} ne '') || ($emails{'notification'} ne '')) { @@ -3858,33 +3964,82 @@ sub notification_information { } if ($req_notifylist) { my $fullname = &Apache::loncommon::plainname($env{'user.name'}, - $env{'user.domain'}); + $env{'user.domain'}); my $sender = $env{'user.name'}.':'.$env{'user.domain'}; &Apache::loncoursequeueadmin::send_selfserve_notification($req_notifylist,"$fullname ($env{'user.name'}:$env{'user.domain'})",$cnum,$env{'form.cdescr'},$now,'coursereq',$sender); } + if (ref($postprocess) eq 'HASH') { + if (ref($postprocess->{'queuedmsg'}) eq 'ARRAY') { + if (scalar(@{$postprocess->{'queuedmsg'}}) > 0) { + my $recipient = $env{'user.name'}.':'.$env{'user.domain'}; + my $sender = $recipient; + my $addmsg = []; + foreach my $item (@{$postprocess->{'queuedmsg'}}) { + if (ref($item) eq 'HASH') { + if ($item->{'mt'} ne '') { + push(@{$addmsg},$item); + } + } + } + if (scalar(@{$addmsg}) > 0) { + &Apache::loncoursequeueadmin::send_selfserve_notification($recipient,$addmsg,$cnum, + $env{'form.cdescr'},$now, + 'queuedreq',$sender); + } + } + } + if ($postprocess->{'queuedweb'}) { + $output .= $postprocess->{'queuedweb'}; + } + } } elsif ($disposition eq 'pending') { $output .= '
'. &mt('Your request has been placed in a queue pending administrative action.').'
'. &mt("Usually this means that your institution's information systems do not list you among the instructional personnel for this course.").'
'. &mt('The list of instructional personnel for the course will be automatically checked daily, and once you are listed the request will be processed.'). '
'; - } elsif (($disposition eq 'created') && ($code)) { - my $codemsg = [{ - mt => 'Students can automatically select your course by entering this code: [_1]', - args => [$code], - }]; - $output .= '

'. - &mt('Students can automatically select your course by entering this code: [_1].',''.$code.''). - '
'. - &mt('A message has been sent to your LON-CAPA account with this information.'); - if ($address ne '') { - $output.= '
'.&mt('And an e-mail has also been sent to: [_1] with this code.',$address); - } - $output .= '

'; - my $sender = $env{'user.name'}.':'.$env{'user.domain'}; - if ($code) { - &Apache::loncoursequeueadmin::send_selfserve_notification($req_notifylist,$codemsg,$cnum,$env{'form.cdescr'}, - $now,'uniquecode',$sender); + } elsif ($disposition eq 'created') { + if (($code) || ((ref($postprocess) eq 'HASH') && + ((ref($postprocess->{'createdmsg'}) eq 'ARRAY') || ($postprocess->{'createdweb'})))) { + my $addmsg = []; + my $recipient = $env{'user.name'}.':'.$env{'user.domain'}; + my $sender = $recipient; + if ($code) { + push(@{$addmsg},{ + mt => 'Students can automatically select your course by entering this code: [_1]', + args => [$code], + }); + $output .= '

'. + &mt('Students can automatically select your course by entering this code: [_1].',''.$code.''). + '
'. + &mt('A message has been sent to your LON-CAPA account with this information.'); + if ($address ne '') { + $output.= '
'.&mt('An e-mail has also been sent to: [_1] with this code.',$address); + } + $output .= '

'; + } + if (ref($postprocess) eq 'HASH') { + if (ref($postprocess->{'createdmsg'}) eq 'ARRAY') { + foreach my $item (@{$postprocess->{'createdmsg'}}) { + if (ref($item) eq 'HASH') { + if ($item->{'mt'} ne '') { + push(@{$addmsg},$item); + } + } + } + } + if ($postprocess->{'createdweb'}) { + $output .= $postprocess->{'createdweb'} + } + } + if (scalar(@{$addmsg}) > 0) { + my $type = 'createdreq'; + if ($code) { + $type = 'uniquecode'; + } + &Apache::loncoursequeueadmin::send_selfserve_notification($recipient,$addmsg,$cnum,$env{'form.cdescr'}, + $now,$type,$sender); + } } } else { $output .= '
'. @@ -4110,7 +4265,7 @@ sub generate_date_items { } sub print_textbook_form { - my ($r,$dom,$incdoms,$domdefs,$settings) = @_; + my ($r,$dom,$incdoms,$domdefs,$settings,$can_request) = @_; my ($bookshash,%ordered); my $crstype = 'textbook'; # @@ -4170,9 +4325,18 @@ sub print_textbook_form { $loaditems{'onload'} = 'javascript:uncheckAllRadio();'; $r->print(&header('Course Request',$jscript,\%loaditems)); + if (ref($can_request) eq 'HASH') { + unless ((scalar(keys(%{$can_request})) == 1) && ($can_request->{'textbook'})) { + &Apache::lonhtmlcommon::add_breadcrumb( + { href => '/adm/requestcourse', + text => 'Pick action', + }); + } + } &Apache::lonhtmlcommon::add_breadcrumb({text=>'Course Request'}); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests')); + &startContentScreen($r,'textbookrequests'); # # Show domain selector form, if required. # @@ -4369,21 +4533,37 @@ sub print_textbook_form { ' '.&mt($accesstitles{'end'}).$endform.'
'); # +# Display any custom fields for this course type +# + my $fullname = &Apache::loncommon::plainname($env{'user.name'}, + $env{'user.domain'}); + my $postprocess = &Apache::lonnet::auto_crsreq_update($dom,undef,$crstype,'review', + $env{'user.name'}, + $env{'user.domain'},$fullname); + if (ref($postprocess) eq 'HASH') { + if ($postprocess->{'reviewweb'}) { + $r->print($postprocess->{'reviewweb'}); + } + } + +# # Submit button # - $r->print(''. + $r->print(''. + ''. ''); # # End request form # - $r->print(''. - &Apache::loncommon::end_page()); + $r->print(''); + &endContentScreen($r). + $r->print(&Apache::loncommon::end_page()); return; } sub process_textbook_request { - my ($r,$dom,$action,$domdefs,$domconfig) = @_; + my ($r,$dom,$action,$domdefs,$domconfig,$can_request) = @_; my ($uniquecode,$req_notifylist); my $crstype = 'textbook'; if (ref($domconfig) eq 'HASH') { @@ -4425,6 +4605,14 @@ sub process_textbook_request { } $r->print(&header('Course Creation')); + if (ref($can_request) eq 'HASH') { + unless ((scalar(keys(%{$can_request})) == 1) && ($can_request->{'textbook'})) { + &Apache::lonhtmlcommon::add_breadcrumb( + { href => '/adm/requestcourse', + text => 'Pick action', + }); + } + } &Apache::lonhtmlcommon::add_breadcrumb( { href => '/adm/requestcourse', text => "Create Course", @@ -4432,6 +4620,7 @@ sub process_textbook_request { ); &Apache::lonhtmlcommon::add_breadcrumb({text=>'Request Processed'}); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests')); + &startContentScreen($r,'textbookrequests'); my $details = { owner => $env{'user.name'}, @@ -4459,6 +4648,7 @@ sub process_textbook_request { } elsif ($result eq 'created') { $r->print('

'.&mt('Create another course').'

'); } + &endContentScreen($r); $r->print(&Apache::loncommon::end_page()); } @@ -4600,6 +4790,20 @@ function validTextbookReq() { ENDSCRIPT } + +sub startContentScreen { + my ($r,$mode)=@_; + $r->print("\n".''."\n"); + $r->print('
'); +} + +sub endContentScreen { + my ($r)=@_; + $r->print('
'); +} 1;