--- loncom/interface/lonrequestcourse.pm 2009/12/15 13:36:16 1.41.2.1 +++ loncom/interface/lonrequestcourse.pm 2010/07/30 23:51:41 1.54.2.1 @@ -1,7 +1,7 @@ # The LearningOnline Network # Request a course # -# $Id: lonrequestcourse.pm,v 1.41.2.1 2009/12/15 13:36:16 raeburn Exp $ +# $Id: lonrequestcourse.pm,v 1.54.2.1 2010/07/30 23:51:41 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -94,8 +94,6 @@ described at http://www.lon-capa.org. =item print_request_outcome() -=item get_processtype() - =item check_autolimit() =item retrieve_settings() @@ -130,7 +128,7 @@ sub handler { } &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['action','showdom','cnum','state','crstype']); + ['action','showdom','cnum','state','crstype','queue']); &Apache::lonhtmlcommon::clear_breadcrumbs(); my $dom = &get_course_dom(); my $action = $env{'form.action'}; @@ -140,13 +138,9 @@ sub handler { $states{'display'} = ['details']; $states{'view'} = ['pick_request','details','cancel','removal']; - $states{'log'} = ['filter','display']; + $states{'log'} = ['display']; $states{'new'} = ['courseinfo','enrollment','personnel','review','process']; - if ($dom eq 'gcitest') { - $states{'new'} = ['courseinfo','review','process']; - } - if (($action eq 'new') && ($env{'form.crstype'} eq 'official')) { unless ($env{'form.state'} eq 'crstype') { unshift(@{$states{'new'}},'codepick'); @@ -172,11 +166,8 @@ sub handler { details => 'Request Details', cancel => 'Cancel Request', removal => 'Outcome', + display => 'Request Logs', ); - if ($dom eq 'gcitest') { - $trail{'crstype'} = 'Building a Test'; - $trail{'courseinfo'} = 'Test Information'; - } if (($env{'form.crstype'} eq 'official') && (&Apache::lonnet::auto_run('',$dom))) { $trail{'enrollment'} = 'Enrollment'; @@ -186,10 +177,10 @@ sub handler { &get_breadcrumbs($dom,$action,\$state,\%states,\%trail); if ($action eq 'display') { if (($dom eq $env{'request.role.domain'}) && (&Apache::lonnet::allowed('ccc',$dom))) { - my $namespace = 'courserequestqueue'; if ($env{'form.cnum'} ne '') { my $cnum = $env{'form.cnum'}; - my $reqkey = $cnum.'_approval'; + my $queue = $env{'form.queue'}; + my $reqkey = $cnum.'_'.$queue; my $namespace = 'courserequestqueue'; my $domconfig = &Apache::lonnet::get_domainconfiguser($dom); my %queued = @@ -285,6 +276,9 @@ sub handler { $jscript = &mainmenu_javascript(); } else { $jscript = &Apache::lonhtmlcommon::set_form_elements($elementsref,\%stored); + if ($state eq 'courseinfo') { + $jscript .= &cloning_javascript(); + } } } @@ -324,7 +318,7 @@ sub handler { } elsif ($action eq 'display') { if ($warning ne '') { my $args = { only_body => 1 }; - $r->print(&header('Course/Community Requests','','',$args).$crumb. + $r->print(&header('Course/Community Requests','','' ,'',$args).$crumb. '<h3>'.&mt('Course/Community Request Details').'</h3>'. '<div class="LC_warning">'.$warning.'</div>'. &close_popup_form()); @@ -333,7 +327,24 @@ sub handler { $loaditems,$crumb,'','','','','',$uname,$udom); } } elsif ($action eq 'log') { - &print_request_logs($jscript,$loaditems,$crumb); + if ($state eq 'crstype') { + &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb,\%request_domains); + } else { + $jscript .= <<ENDJS; + +function backPage(formname,prevstate) { + formname.state.value = prevstate; + formname.submit(); +} + +function setPage(formname) { + formname.page.value = '1'; + return; +} + +ENDJS + &print_request_logs($r,$dom,$jscript,$loaditems,$crumb); + } } else { &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb,\%request_domains); } @@ -364,18 +375,26 @@ function setAction(courseForm) { END } +sub cloning_javascript { + return <<"END"; +function setCloneDisplay(courseForm) { + if (courseForm.cloning.length > 1) { + for (var i=0; i<courseForm.cloning.length; i++) { + if (courseForm.cloning[i].checked) { + if (courseForm.cloning[i].value == 1) { + document.getElementById('cloneoptions').style.display="block";; + } + } + } + } +} +END +} + sub get_breadcrumbs { my ($dom,$action,$state,$states,$trail) = @_; my ($crumb,$newinstcode,$codechk,$checkedcode,$numtitles,$description); my $page = 0; - my $firstcrumb = 'Pick Action'; - my $crumbtitle = 'Course/Community Requests'; - my $crumbhelp = 'Course_Requests'; - if ($dom eq 'gcitest') { - $firstcrumb = 'Building a Test'; - $crumbtitle = 'Create Concept Test'; - $crumbhelp = 'Concept_Test_Creation'; - } if ((ref($states) eq 'HASH') && (ref($trail) eq 'HASH') && (ref($state))) { if (defined($action)) { my $done = 0; @@ -417,7 +436,7 @@ sub get_breadcrumbs { if ($$state eq $states->{$action}[$i]) { &Apache::lonhtmlcommon::add_breadcrumb( {text=>"$trail->{$$state}"}); - $crumb = &Apache::lonhtmlcommon::breadcrumbs($crumbtitle,$crumbhelp); + $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course/Community Requests','Course_Requests'); last; } else { if (($$state eq 'process') || ($$state eq 'removal')) { @@ -436,13 +455,13 @@ sub get_breadcrumbs { } } else { &Apache::lonhtmlcommon::add_breadcrumb( - {text=>$firstcrumb}); - $crumb = &Apache::lonhtmlcommon::breadcrumbs($crumbtitle,$crumbhelp); + {text=>'Pick Action'}); + $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course/Community Requests','Course_Requests'); } } else { &Apache::lonhtmlcommon::add_breadcrumb( - {text=>$firstcrumb}); - $crumb = &Apache::lonhtmlcommon::breadcrumbs($crumbtitle,$crumbhelp); + {text=>'Pick Action'}); + $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course/Community Requests','Course_Requests'); } return ($page,$crumb,$newinstcode,$codechk,$checkedcode,$description); } @@ -480,6 +499,7 @@ sub form_elements { }, courseinfo => { cdescr => 'text', + cloning => 'radio', clonecrs => 'text', clonedom => 'selectbox', datemode => 'radio', @@ -515,22 +535,12 @@ sub form_elements { }, ); my %servers = &Apache::lonnet::get_servers($dom,'library'); - if ($dom eq 'gcitest') { - %{$elements{'new'}{'courseinfo'}} = ( - cdescr => 'text', - concepttest => 'radio', - ); - } my $numlib = keys(%servers); if ($numlib > 1) { $elements{'new'}{'courseinfo'}{'chome'} = 'selectbox'; } else { $elements{'new'}{'courseinfo'}{'chome'} = 'hidden'; } - if ($dom eq 'gcitest') { - my %mergedhash = (%{$elements{'new'}{'courseinfo'}},%{$elements{'new'}{'enrollment'}}); - %{$elements{'new'}{'courseinfo'}} = %mergedhash; - } my (@codetitles,%cat_titles,%cat_order,@code_order,$lastitem); &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles, \%cat_order,\@code_order); @@ -625,7 +635,10 @@ sub onload_action { if ($state eq 'crstype') { $loaditems{'onload'} = 'javascript:setAction(document.mainmenu_action);javascript:setType(document.mainmenu_coursetype)'; } else { - $loaditems{'onload'} = 'javascript:setFormElements(document.requestcrs)'; + $loaditems{'onload'} = 'javascript:setFormElements(document.requestcrs);'; + } + if ($state eq 'courseinfo') { + $loaditems{'onload'} .= 'javascript:setCloneDisplay(document.requestcrs);'; } } return \%loaditems; @@ -652,9 +665,7 @@ sub print_main_menu { } } - my $js; - unless ($dom eq 'gcitest') { - $js = <<"END"; + my $js = <<"END"; function nextPage(formname) { var crschoice = document.mainmenu_coursetype.crstype.value; @@ -678,20 +689,20 @@ function check_can_request(crschoice,act var unofficial = ''; var community = ''; END - if (ref($can_request) eq 'HASH') { - foreach my $item (keys(%{$can_request})) { - $js .= " - $item = 1; + if (ref($can_request) eq 'HASH') { + foreach my $item (keys(%{$can_request})) { + $js .= " + $item = 1; "; - } } - my %lt = &Apache::lonlocal::texthash( - official => 'You are not permitted to request creation of an official course in this domain.', - unofficial => 'You are not permitted to request creation of an unofficial course in this domain.', - community => 'You are not permitted to request creation of a community this domain.', - all => 'You must choose a specific course type when making a new course request.\\nAll types is not allowed.', - ); - $js .= <<END; + } + my %lt = &Apache::lonlocal::texthash( + official => 'You are not permitted to request creation of an official course in this domain.', + unofficial => 'You are not permitted to request creation of an unofficial course in this domain.', + community => 'You are not permitted to request creation of a community this domain.', + all => 'You must choose a specific course type when making a new course request.\\n\"All types\" is not allowed.', + ); + $js .= <<END; if (crschoice == 'official') { if (official != 1) { alert("$lt{'official'}"); @@ -699,9 +710,9 @@ END } } else { if (crschoice == 'unofficial') { - if (unofficial != 1) { - alert("$lt{'unofficial'}"); - return false; + if (unofficial != 1) { + alert("$lt{'unofficial'}"); + return false; } } else { if (crschoice == 'community') { @@ -713,14 +724,13 @@ END if (actionchoice == 'new') { alert("$lt{'all'}"); return false; - } + } } } } return true; } END - } my ($pagetitle,$pageinfo,$domaintitle); if (ref($can_request) eq 'HASH') { if (($can_request->{'official'}) || ($can_request->{'unofficial'})) { @@ -743,40 +753,6 @@ END $domaintitle = &mt('Course/Community Domain'); } } - - if ($dom eq 'gcitest') { - my $formname = 'requestcrs'; - my $nexttext = &mt('Continue'); - $r->print(&header($pagetitle,$js.$jscript,$loaditems).$crumb. - '<p>'.&mt('Deployment of a Concept Test requires completion of the following three steps:').'<ol>'. - '<li>'.&mt('Creation of a course "container" and setting of access dates').'</li>'. - '<li>'.&mt('Assembly of a valid test from Concept Inventory questions').'</li>'. - '<li>'.&mt('Enrollment of students').'</li>'. - '</ol></p><p>'.&mt('When assembling a test you may either:'). - '<br />'.&mt('(a) have a valid test built automatically by the WebCenter, or').'<br />'.&mt('(b) select the questions to include by combining questions chosen from eleven bins with four mandatory questions.').'</p><p>'.&mt('The most efficient way to enroll students is to upload a text file containing usernames and passwords.').'<br />'.&mt("Students' full e-mail addresses should be used as their usernames to ensure uniqueness.").'</p><div>'. - '<form name="'.$formname.'" method="post" action="/adm/requestcourse">'."\n". - '<input type="hidden" name="state" value="courseinfo" />'."\n". - '<input type="hidden" name="showdom" value="'.$dom.'" />'."\n". - '<input type="hidden" name="crstype" value="unofficial" />'."\n". - '<input type="hidden" name="action" value="new" />'."\n". - '<input type="button" name="next" value="'.$nexttext. - '" onclick="this.form.submit();" />'."\n". - '</form></div>'. - &Apache::loncommon::end_page()); - return; - } - - if (!$onchange) { - $r->print(' <input type="submit" name="godom" value="'. - &mt('Change').'" />'); - } - unless ((ref($can_request) eq 'HASH') && (keys(%{$can_request}) > 0)) { - $r->print(&Apache::lonhtmlcommon::row_closure(1)."\n". - &Apache::lonhtmlcommon::end_pick_box().'</div>'."\n". - &Apache::loncommon::end_page()); - return; - } - my @incdoms; if (ref($request_domains) eq 'HASH') { foreach my $item (keys(%{$request_domains})) { @@ -816,7 +792,7 @@ END <option value="view">'.&mt('View/Modify/Cancel pending requests').'</option> <option value="log">'.&mt('View request history').'</option> </select></form>'. - &Apache::lonhtmlcommon::row_closure(1). + &Apache::lonhtmlcommon::row_closure(). &Apache::lonhtmlcommon::row_title(&mt('Type')).' <form name="mainmenu_coursetype" method="post" action=""> <select size="1" name="crstype">'); @@ -884,7 +860,7 @@ END } if ($action eq 'new') { my $jsextra; - if ($state eq 'courseinfo') { + if (($state eq 'courseinfo') || ($state eq 'codepick')) { $jsextra = "\n".&Apache::loncommon::coursebrowser_javascript($dom); } elsif ($state eq 'enrollment') { if (($env{'form.crstype'} eq 'official') && @@ -937,7 +913,7 @@ END $title = &mt('Pending course/community requests'); } $r->print('<h3>'.$title.'</h3><div>'."\n".$form."\n". - &print_request_status($dom).'</form></div>'); + &print_request_status($dom,$action).'</form></div>'); } elsif ($state eq 'details') { my (@codetitles,%cat_titles,%cat_order,@code_order,$instcode,$code_chk); my $origcnum = $env{'form.cnum'}; @@ -1059,8 +1035,6 @@ END &print_review($dom,\@codetitles,\%cat_titles,\%cat_order, \@code_order,$uname,$udom)."\n".'</div>'. &close_popup_form()); - } elsif ($action eq 'log') { - $r->print(&coursereq_log('View request log',$jscript,$loaditems).$crumb); } $r->print(&Apache::loncommon::end_page()); return; @@ -1407,7 +1381,11 @@ sub print_request_form { if ($env{'form.origcnum'} =~ /^($match_courseid)$/) { $cnum = $env{'form.origcnum'}; } else { - $cnum = &Apache::lonnet::generate_coursenum($dom); + my $gentype = 'Course'; + if ($crstype eq 'community') { + $gentype = 'Community'; + } + $cnum = &Apache::lonnet::generate_coursenum($dom,$gentype); } &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles, \%cat_order,\@code_order); @@ -1428,7 +1406,7 @@ sub print_request_form { &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles, \%cat_order,\@code_order); } - my ($storeresult,$result) = &print_request_outcome($r,$dom,\@codetitles, + my ($storeresult,$result) = &print_request_outcome($dom,\@codetitles, \@code_order); $r->print($result); if (($storeresult eq 'ok') || ($storeresult eq 'created')) { @@ -1620,6 +1598,7 @@ sub print_enrollment_menu { my $access_dates = &date_setting_table($starttime,$endtime,$formname,'access',$hasauto, %accesstitles); + $output .= &Apache::lonhtmlcommon::start_pick_box(); if ($sections) { $output .= $sections; } @@ -1639,12 +1618,8 @@ sub print_enrollment_menu { &Apache::lonhtmlcommon::row_closure(1). $access_dates } - if ($dom eq 'gcitest') { - return $output; - } else { - return '<div>'.&Apache::lonhtmlcommon::start_pick_box().$output. - &Apache::lonhtmlcommon::end_pick_box().'</div>'; - } + return '<div>'.&Apache::lonhtmlcommon::start_pick_box().$output. + &Apache::lonhtmlcommon::end_pick_box().'</div>'; } sub show_invalid_crosslists { @@ -1736,10 +1711,10 @@ sub date_setting_table { } $table = &Apache::lonhtmlcommon::row_title(&Apache::loncommon::help_open_topic($help_item{$prefix}{'start'}). - ' '.$datetitles{'start'}).$startform. + ' '.&mt($datetitles{'start'})).$startform. &Apache::lonhtmlcommon::row_closure(1). &Apache::lonhtmlcommon::row_title(&Apache::loncommon::help_open_topic($help_item{$prefix}{'end'}). - ' '.$datetitles{'end'}).$endform.$perpetual. + ' '.&mt($datetitles{'end'})).$endform.$perpetual. &Apache::lonhtmlcommon::row_closure($closure); return $table; } @@ -1886,51 +1861,93 @@ sub current_lc_sections { return @currsecs; } -sub print_request_status { - my ($dom) = @_; +sub sorted_request_history { + my ($dom,$action,$curr_req) = @_; + my ($after,$before,$statusfilter,$crstypefilter); + if ($env{'form.status'} ne '') { + $statusfilter = $env{'form.status'}; + } + if ($env{'form.crstype'} ne '') { + $crstypefilter = $env{'form.crstype'}; + } + if (ref($curr_req) eq 'HASH') { + $after = $curr_req->{'requested_after_date'}, + $before = $curr_req->{'requested_before_date'}; + $statusfilter = $curr_req->{'status'}; + $crstypefilter = $curr_req->{'crstype'}; + } my %statusinfo = &Apache::lonnet::dump('courserequests',$env{'user.domain'}, $env{'user.name'},'^status:'.$dom); - my ($output,$formname,%queue_by_date); + my %queue_by_date; my ($types,$typenames) = &Apache::loncommon::course_types(); foreach my $key (keys(%statusinfo)) { - if (($statusinfo{$key} eq 'approval') || ($statusinfo{$key} eq 'pending')) { - (undef,my($cdom,$cnum)) = split(':',$key); - next if ($cdom ne $dom); - my $requestkey = $cdom.'_'.$cnum; - if ($requestkey =~ /^($match_domain)_($match_courseid)$/) { - my %history = &Apache::lonnet::restore($requestkey,'courserequests', - $env{'user.domain'},$env{'user.name'}); - my $entry; - my $timestamp = $history{'reqtime'}; - my $crstype = $history{'crstype'}; - my $disposition = $history{'disposition'}; + if ($action eq 'view') { + next unless (($statusinfo{$key} eq 'approval') || ($statusinfo{$key} eq 'pending')); + } else { + next unless (($statusfilter eq 'any') || + ($statusfilter eq $statusinfo{$key})); + } + (undef,my($cdom,$cnum)) = split(':',$key); + next if ($cdom ne $dom); + my $requestkey = $cdom.'_'.$cnum; + if ($requestkey =~ /^($match_domain)_($match_courseid)$/) { + my %history = &Apache::lonnet::restore($requestkey,'courserequests', + $env{'user.domain'},$env{'user.name'}); + my $entry; + my $reqtime = $history{'reqtime'}; + my $lastupdate = $history{'timestamp'}; + my $crstype = $history{'crstype'}; + my $disposition = $history{'disposition'}; + my $status = $history{'status'}; + if ($action eq 'view') { next if ((exists($history{'status'})) && ($history{'status'} eq 'created')); - next unless (($env{'form.crstype'} eq 'any') || - ($env{'form.crstype'} eq $crstype)); + } else { + next if (($reqtime < $after) || ($reqtime > $before)); + } + next unless (($crstypefilter eq 'any') || + ($crstypefilter eq $crstype)); + if ($action eq 'view') { next unless (($disposition eq 'approval') || ($disposition eq 'pending')); - if (ref($history{'details'}) eq 'HASH') { - $entry = $requestkey.':'.$crstype.':'. - &escape($history{'details'}{'cdescr'}); - if ($crstype eq 'official') { - $entry .= ':'.&escape($history{'details'}{'instcode'}); + } + if (ref($history{'details'}) eq 'HASH') { + $entry = $requestkey.':'.$crstype.':'. + &escape($history{'details'}{'cdescr'}); + if ($action eq 'log') { + $entry .= ':'.$lastupdate.':'; + if ($statusinfo{$key} ne '') { + $entry .= $statusinfo{$key}; + } elsif ($status ne '') { + $entry .= $status; + } else { + $entry .= $disposition; } } - if ($entry ne '') { - if (exists($queue_by_date{$timestamp})) { - if (ref($queue_by_date{$timestamp}) eq 'ARRAY') { - push(@{$queue_by_date{$timestamp}},$entry); - } - } else { - @{$queue_by_date{$timestamp}} = ($entry); + if ($crstype eq 'official') { + $entry .= ':'.&escape($history{'details'}{'instcode'}); + } + } + if ($entry ne '') { + if (exists($queue_by_date{$reqtime})) { + if (ref($queue_by_date{$reqtime}) eq 'ARRAY') { + push(@{$queue_by_date{$reqtime}},$entry); } + } else { + @{$queue_by_date{$reqtime}} = ($entry); } } } } - $formname = 'requestcrs'; + return %queue_by_date; +} + +sub print_request_status { + my ($dom,$action) = @_; + my %queue_by_date = &sorted_request_history($dom,$action); my @sortedtimes = sort {$a <=> $b} (keys(%queue_by_date)); - $output = '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'."\n". + my $formname = 'requestcrs'; + my ($types,$typenames) = &Apache::loncommon::course_types(); + my $output = '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'."\n". '<input type="hidden" name="state" value="'.$env{'form.state'}.'" />'."\n". '<input type="hidden" name="crstype" value="'.$env{'form.crstype'}.'" />'."\n". @@ -2110,10 +2127,291 @@ ENDJS } sub print_request_logs { - my ($jscript,$loaditems,$crumb) = @_; + my ($r,$dom,$jscript,$loaditems,$crumb) = @_; + my $title; + if ($env{'form.crstype'} eq 'community') { + $title = 'Community Request Logs'; + } elsif ($env{'form.crstype'} eq 'any') { + $title = 'Course/Community Request Logs'; + } else { + $title = 'Course Request Logs'; + } + $r->print(&header($title,$jscript,$loaditems).$crumb); + my $formname = 'requestcrs'; + $r->print('<form action="/adm/requestcourse" method="post" name="'.$formname.'" onsubmit="javascript:setPage(this);">'."\n". + '<input type="hidden" name="action" value="log" />'."\n". + '<input type="hidden" name="state" value="display" />'."\n"); + # set defaults + my $now = time(); + my $defstart = $now - (7*24*3600); #7 days ago + my %defaults = ( + page => '1', + show => '10', + crstype => 'any', + status => 'any', + requested_before_date => $now, + requested_after_date => $defstart, + ); + my ($types,$typenames) = &Apache::loncommon::course_types(); + my $more_records = 0; + my %curr; + foreach my $item ('show','page','crstype','status') { + $curr{$item} = $env{'form.'.$item}; + } + $curr{'requested_after_date'} = &Apache::lonhtmlcommon::get_date_from_form('requested_after_date'); + $curr{'requested_before_date'} = &Apache::lonhtmlcommon::get_date_from_form('requested_before_date'); + foreach my $key (keys(%defaults)) { + if ($curr{$key} eq '') { + $curr{$key} = $defaults{$key}; + } + } + my ($statuses,$statusnames) = &reqstatus_names($curr{'crstype'}); + $r->print('<input type="hidden" name="page" value="'.$curr{'page'}.'" />'. + &requestlog_display_filter($formname,\%curr)); + my %queue_by_date = &sorted_request_history($dom,$env{'form.action'},\%curr); + my @sortedtimes = sort {$a <=> $b} (keys(%queue_by_date)); + my $showntablehdr = 0; + my $tablehdr = &Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row(). + '<th> </th><th>'.&mt('Request Date').'</th>'. + '<th>'.&mt('Description').'</th>'; + if ($curr{'crstype'} eq 'any') { + $tablehdr .= '<th>'.&mt('Course Type').'</th>'; + } + if (($curr{'crstype'} eq 'official') || ($curr{'crstype'} eq 'any')) { + $tablehdr .= '<th>'.&mt('Institutional Code').'</th>'; + } + if ($curr{'status'} eq 'any') { + $tablehdr .= '<th>'.&mt('Status').'</th>'; + } elsif ($curr{'status'} eq 'created') { + $tablehdr .= '<th>'.&mt('Creation Date').'</th>'; + } elsif ($curr{'status'} eq 'cancelled') { + $tablehdr .= '<th>'.&mt('Cancellation Date').'</th>'; + } elsif ($curr{'status'} eq 'rejected') { + $tablehdr .= '<th>'.&mt('Rejection Date').'</th>'; + } + $tablehdr .= &Apache::loncommon::end_data_table_header_row(); + my ($minshown,$maxshown); + $minshown = 1; + my $count = 0; + if ($curr{'show'} ne &mt('all')) { + $maxshown = $curr{'page'} * $curr{'show'}; + if ($curr{'page'} > 1) { + $minshown = 1 + ($curr{'page'} - 1) * $curr{'show'}; + } + } + my $norecords; + if (@sortedtimes > 0) { + foreach my $item (@sortedtimes) { + if ($curr{'show'} ne &mt('all')) { + if ($count >= $curr{'page'} * $curr{'show'}) { + $more_records = 1; + last; + } + } + $count ++; + next if ($count < $minshown); + if (!$showntablehdr) { + $r->print($tablehdr); + $showntablehdr = 1; + } + 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 ($cdom,$cnum) = split('_',$key); + my $output = &Apache::loncommon::start_data_table_row(). + '<td>'.$count.'</td>'. + '<td>'.$showtime.'</td>'. + '<td>'.&unescape($desc).'</td>'; + if ($curr{'crstype'} eq 'any') { + my $typename; + if (ref($typenames) eq 'HASH') { + $typename = &mt($typenames->{$crstype}); + } + if ($typename eq '') { + $typename = &mt('Unknown type'); + } + $output .= '<td>'.$typename.'</td>'; + } + if (($curr{'crstype'} eq 'any') || + ($curr{'crstype'} eq 'official')) { + my $showinstcode; + if ($crstype eq 'official') { + $showinstcode = &unescape($instcode); + } else { + $showinstcode = &mt('Not applicable'); + } + $output .= '<td>'.$showinstcode.'</td>'; + } + if ($curr{'status'} eq 'any') { + my $statusname = &mt('Unknown status'); + if (ref($statusnames) eq 'HASH') { + if ($statusnames->{$status} ne '') { + $statusname = $statusnames->{$status}; + } + } + if (($status eq 'created') || ($status eq 'cancelled') || + ($status eq 'rejected')) { + $statusname .= ' '.&Apache::lonlocal::locallocaltime($timestamp); + } + $output .= '<td>'.$statusname.'</td>'; + } elsif (($status eq 'created') || ($status eq 'cancelled') || + ($status eq 'rejected')) { + $output .= '<td>'.&Apache::lonlocal::locallocaltime($timestamp).'</td>'; + } + $output .= &Apache::loncommon::end_data_table_row(); + $r->print($output); + } + } + } + if ($showntablehdr) { + $r->print(&Apache::loncommon::end_data_table()); + if (($curr{'page'} > 1) || ($more_records)) { + $r->print('<table><tr>'); + if ($curr{'page'} > 1) { + $r->print('<td><a href="javascript:chgPage('."'previous'".');">'.&mt('Previous [_1] changes',$curr{'show'}).'</a></td>'); + } + if ($more_records) { + $r->print('<td><a href="javascript:chgPage('."'next'".');">'.&mt('Next [_1] changes',$curr{'show'}).'</a></td>'); + } + $r->print('</tr></table>'); + $r->print(<<"ENDSCRIPT"); +<script type="text/javascript"> +// <![CDATA[ +function chgPage(caller) { + if (caller == 'previous') { + document.$formname.page.value --; + } + if (caller == 'next') { + document.$formname.page.value ++; + } + document.$formname.submit(); + return; +} +// ]]> +</script> +ENDSCRIPT + } + } else { + $norecords = 1; + } + } else { + $norecords = 1; + } + if ($norecords) { + $r->print('<p class="LC_info">'. + &mt('There are no records to display'). + '</p>'); + } + $r->print('</form>'. + &Apache::loncommon::end_page()); return; } +sub reqstatus_names { + my ($crstype) = @_; + my @statuses = qw(created approval pending rejected cancelled); + my %statusnames = + &Apache::lonlocal::texthash ( + created => 'Created', + approval => 'Queued pending approval', + pending => 'Queued pending validation', + rejected => 'Request rejected', + cancelled => 'Request cancelled', + ); + if (($crstype eq 'official') || ($crstype eq 'unofficial')) { + $statusnames{'created'} = &mt('Course created'); + } elsif ($crstype eq 'community') { + $statusnames{'created'} = &mt('Community created'); + } + return (\@statuses,\%statusnames); +} + +sub requestlog_display_filter { + my ($formname,$curr) = @_; + my $nolink = 1; + my $output = '<table><tr><td valign="top">'. + '<span class="LC_nobreak"><b>'.&mt('Records/page:').'</b></span><br />'. + &Apache::lonmeta::selectbox('show',$curr->{'show'},undef, + (&mt('all'),5,10,20,50,100,1000,10000)). + '</td><td> </td>'; + my $startform = + &Apache::lonhtmlcommon::date_setter($formname,'requested_after_date', + $curr->{'requested_after_date'},undef, + undef,undef,undef,undef,undef,undef,$nolink); + my $endform = + &Apache::lonhtmlcommon::date_setter($formname,'requested_before_date', + $curr->{'requested_before_date'},undef, + undef,undef,undef,undef,undef,undef,$nolink); + $output .= '<td valign="top"><b>'.&mt('Window during which course/community was requested:').'</b><br />'. + '<table><tr><td>'.&mt('After:'). + '</td><td>'.$startform.'</td></tr>'. + '<tr><td>'.&mt('Before:').'</td>'. + '<td>'.$endform.'</td></tr></table>'. + '</td>'. + '<td> </td>'; + my ($types,$typenames) = &Apache::loncommon::course_types(); + if (ref($types) eq 'ARRAY') { + if (@{$types} > 1) { + $output .= '<td valign="top"><b>'. + &mt('Course Type:').'</b><br /><select name="crstype">'; + my $selstr = ''; + if ($curr->{'crstype'} eq 'any') { + $selstr = ' selected="selected"'; + } + $output .= '<option value="any"'.$selstr.'>'.&mt('All types').'</option>'."\n"; + foreach my $crstype (@{$types}) { + my $selstr = ''; + if ($curr->{'crstype'} eq $crstype) { + $selstr = ' selected="selected"'; + } + my $typename = $crstype; + if (ref($typenames) eq 'HASH') { + if ($typenames->{$crstype} ne '') { + $typename = $typenames->{$crstype}; + } + } + $output .= '<option value="'.$crstype.'"'.$selstr.'>'.$typename.'</option>'."\n"; + } + $output .= '</select></td>'; + } + } + my ($statuses,$statusnames) = &reqstatus_names($curr->{'crstype'}); + if (ref($statuses) eq 'ARRAY') { + if (@{$statuses} > 1) { + $output .= '<td valign="top"><b>'. + &mt('Request Status:').'</b><br /><select name="status">'; + my $selstr = ''; + if ($curr->{'status'} eq 'any') { + $selstr = ' selected="selected"'; + } + $output .= '<option value="any"'.$selstr.'>'.&mt('Any status').'</option>'."\n"; + foreach my $status (@{$statuses}) { + my $selstr = ''; + if ($curr->{'status'} eq $status) { + $selstr = ' selected="selected"'; + } + my $statusname = $status; + if (ref($statusnames) eq 'HASH') { + if ($statusnames->{$status} ne '') { + $statusname = $statusnames->{$status}; + } + } + $output .= '<option value="'.$status.'"'.$selstr.'>'.$statusname.'</option>'."\n"; + } + $output .= '</select></td>'; + } + } + $output .= '</tr></table>'; + + # Update Display button + $output .= '<p>'. + '<input type="submit" value="'.&mt('Update Display').'" />'. + '</p><hr />'; + return $output; +} + sub print_review { my ($dom,$codetitles,$cat_titles,$cat_order,$code_order,$uname,$udom, $disallowed,$disallowmsg) = @_; @@ -2236,52 +2534,42 @@ sub print_review { } my %ctxt = &clone_text(); - if ($dom eq 'gcitest') { - $inst_headers .= '<th>'.&mt('Test Questions').'</th>'; - my $concepttest; - if ($env{'form.concepttest'} eq 'defchosen') { - $concepttest = 'Auto-generated'; - } elsif ($env{'form.concepttest'} eq 'editmyown') { - $concepttest = 'Manually selected'; - } - $inst_values .= '<td>'.$concepttest.'</td>'; - } else { - $inst_headers .= '<th>'.&mt('Clone From').'</th>'; - if (($env{'form.clonecrs'} =~ /^$match_name$/) && - ($env{'form.clonedom'} =~ /^$match_domain$/)) { - my $canclone = &Apache::loncoursequeueadmin::can_clone_course($env{'user.name'}, + $inst_headers .= '<th>'.&mt('Clone From').'</th>'; + if (($env{'form.cloning'}) && + ($env{'form.clonecrs'} =~ /^$match_name$/) && + ($env{'form.clonedom'} =~ /^$match_domain$/)) { + my $canclone = &Apache::loncoursequeueadmin::can_clone_course($env{'user.name'}, $env{'user.domain'},$env{'form.clonecrs'},$env{'form.clonedom'}, $env{'form.crstype'}); - if ($canclone) { - my %courseenv = &Apache::lonnet::userenvironment($env{'form.clonedom'}, + if ($canclone) { + my %courseenv = &Apache::lonnet::userenvironment($env{'form.clonedom'}, $env{'form.clonecrs'},('description','internal.coursecode')); - if (keys(%courseenv) > 0) { - $inst_headers .= '<th>'.$ctxt{'dsh'}.'</th>'; - $inst_values .= '<td>'.$courseenv{'description'}.' '; - my $cloneinst = $courseenv{'internal.coursecode'}; - if ($cloneinst ne '') { - $inst_values .= $cloneinst.' '.&mt('in').' '.$env{'form.clonedom'}; - } else { - $inst_values .= &mt('from').' '.$env{'form.clonedom'}; - } - $inst_values .= '</td><td>'; - if ($env{'form.datemode'} eq 'preserve') { - $inst_values .= $ctxt{'prd'}; - } elsif ($env{'form.datemode'} eq 'shift') { - $inst_values .= &mt('Shift dates by [_1] days',$env{'form.dateshift'}); - } else { - $inst_values .= $ctxt{'ncd'}; - } - $inst_values .= '</td>'; - } else { - $inst_values .= '<td>'.&mt('Unknown').'</td>'; - } + if (keys(%courseenv) > 0) { + $inst_headers .= '<th>'.$ctxt{'dsh'}.'</th>'; + $inst_values .= '<td>'.$courseenv{'description'}.' '; + my $cloneinst = $courseenv{'internal.coursecode'}; + if ($cloneinst ne '') { + $inst_values .= $cloneinst.' '.&mt('in').' '.$env{'form.clonedom'}; + } else { + $inst_values .= &mt('from').' '.$env{'form.clonedom'}; + } + $inst_values .= '</td><td>'; + if ($env{'form.datemode'} eq 'preserve') { + $inst_values .= $ctxt{'prd'}; + } elsif ($env{'form.datemode'} eq 'shift') { + $inst_values .= &mt('Shift dates by [_1] days',$env{'form.dateshift'}); + } else { + $inst_values .= $ctxt{'ncd'}; + } + $inst_values .= '</td>'; } else { - $inst_values .= '<td>'.&mt('Not permitted'),'</td>'; + $inst_values .= '<td>'.&mt('Unknown').'</td>'; } - } else { - $inst_values .= '<td>'.&mt('None').'</td>'; - } + } else { + $inst_values .= '<td>'.&mt('Not permitted'),'</td>'; + } + } else { + $inst_values .= '<td>'.&mt('None').'</td>'; } $enroll_headers .= '<th>'.&mt('Access Starts').'</th>'. '<th>'.&mt('Access Ends').'</th>'; @@ -2430,31 +2718,40 @@ function validateForm() { } nextPage(document.$formname,'$next'); } + +function toggleCloning() { + var willclone; + if (document.$formname.cloning.length > 1) { + for (var i=0; i<document.$formname.cloning.length; i++) { + if (document.$formname.cloning[i].checked) { + willclone = document.$formname.cloning[i].value; + } + } + } + if (willclone == 1) { + document.getElementById('cloneoptions').style.display="block"; + } else { + document.getElementById('cloneoptions').style.display="none"; + document.$formname.clonecrs.value = ''; + } +} + // ]] </script> ENDJS my $title = &mt('Brief Course Description'); - my $desctitle = &mt('Description'); - if ($dom eq 'gcitest') { - $title = &mt('Concept Test Course Information'); - $desctitle = &mt('Concept Test Title'); - } my $clonetitle = &mt('Clone content and settings from an existing course?'); if ($crstype eq 'community') { $title = &mt('Brief Community Description'); $clonetitle = &mt('Clone content and settings from an existing community?'); } - my $output .= $js_validate."\n".'<div>'.&Apache::lonhtmlcommon::start_pick_box(). + my $output .= $js_validate."\n".&Apache::lonhtmlcommon::start_pick_box(). &Apache::lonhtmlcommon::row_headline(). '<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Description').' '.$title.'</h3>'. &Apache::lonhtmlcommon::row_closure(1). - &Apache::lonhtmlcommon::row_title($desctitle). + &Apache::lonhtmlcommon::row_title(&mt('Description')). '<input type="text" size="60" name="cdescr" value="'.$description.'" />'; - if ($dom eq 'gcitest') { - $output .= &Apache::lonhtmlcommon::row_closure(1). - &concepttest_form(); - } my ($home_server_pick,$numlib) = &Apache::loncommon::home_server_form_item($dom,'chome', 'default','hide'); @@ -2463,49 +2760,43 @@ ENDJS &Apache::lonhtmlcommon::row_title(&mt('Home Server for Course')); } $output .= $home_server_pick. - &Apache::lonhtmlcommon::row_closure(); - if ($dom eq 'gcitest') { - my ($instcode,@codetitles,%cat_titles,%cat_order,@code_order); - my $invalidcrosslist = []; - $output .= &print_enrollment_menu($formname,$instcode,$dom, - \@codetitles,\%cat_titles,\%cat_order, - \@code_order,$invalidcrosslist); - } else { - $output .= + &Apache::lonhtmlcommon::row_closure(). &Apache::lonhtmlcommon::row_headline(). - '<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Clone').' '.$clonetitle.'</h3>'. + '<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Clone').' '.$clonetitle. &Apache::lonhtmlcommon::row_closure(1). - &clone_form($dom,$formname,$crstype); - } - $output .= &Apache::lonhtmlcommon::end_pick_box().'</div>'."\n"; + &Apache::lonhtmlcommon::row_title(&mt('Clone?')). + '<label><input type="radio" name="cloning" value="1" '. + 'onclick="javascript:toggleCloning()" />'. + &mt('Yes').(' 'x2).'</label><label>'. + '<input type="radio" name="cloning" value="0" checked="checked" '. + 'onclick="javascript:toggleCloning()" />'.&mt('No').'</label>'. + '</h3>'. + &Apache::lonhtmlcommon::row_closure(1). + &Apache::lonhtmlcommon::row_headline(). + '<div id="cloneoptions" style="display: none" >'. + &Apache::lonhtmlcommon::start_pick_box(). + &clone_form($dom,$formname,$crstype). + &Apache::lonhtmlcommon::end_pick_box().'</div>'. + &Apache::lonhtmlcommon::end_pick_box()."\n"; return $output; } -sub concepttest_form { - return &Apache::lonhtmlcommon::row_title(&mt('Questions included in Concept Test')). - '<input type="radio" name="concepttest" value="defchosen" /> '. - &mt('Automatically selected by WebCenter'). - '</label><br /><label>'. - '<input type="radio" name="concepttest" value="editmyown" checked="checked" /> '. - &mt('Chosen by you from Concept Inventory'). - '</label><br /><label>'; -} - sub clone_form { my ($dom,$formname,$crstype) = @_; my $type = 'Course'; if ($crstype eq 'community') { $type = 'Community'; } - my $cloneform = &Apache::loncommon::select_dom_form($dom,'clonedom').' '. - &Apache::loncommon::selectcourse_link($formname,'clonecrs','clonedom','','','',$type); my %lt = &clone_text(); my $output .= - &Apache::lonhtmlcommon::row_title($lt{'cid'}).'<label>'. - '<input type="text" size="25" name="clonecrs" value="" />'. - '</label>'.&Apache::lonhtmlcommon::row_closure(1). &Apache::lonhtmlcommon::row_title($lt{'dmn'}).'<label>'. - $cloneform.'</label>'.&Apache::lonhtmlcommon::row_closure(1). + &Apache::loncommon::select_dom_form($dom,'clonedom').'</label>'. + &Apache::lonhtmlcommon::row_closure(1). + &Apache::lonhtmlcommon::row_title($lt{'cid'}).'<label>'. + '<input type="text" size="25" name="clonecrs" value="" onfocus="this.blur();opencrsbrowser('."'$formname','clonecrs','clonedom','','','','','$type'".')" />'. + '</label> '. + &Apache::loncommon::selectcourse_link($formname,'clonecrs','clonedom','','','',$type). + &Apache::lonhtmlcommon::row_closure(1). &Apache::lonhtmlcommon::row_title($lt{'dsh'}).'<label>'. '<input type="radio" name="datemode" value="delete" /> '.$lt{'ncd'}. '</label><br /><label>'. @@ -2532,7 +2823,7 @@ sub clone_text { sub coursecode_form { my ($dom,$context,$codetitles,$cat_titles,$cat_order,$num) = @_; my $output; - my %rowtitle = ( + my %rowtitle = &Apache::lonlocal::texthash ( instcode => 'Course Category', crosslist => 'Cross Listed Course', ); @@ -2712,7 +3003,7 @@ sub display_navbuttons { } sub print_request_outcome { - my ($r,$dom,$codetitles,$code_order) = @_; + my ($dom,$codetitles,$code_order) = @_; my ($output,$cnum,$now,$req_notifylist,$crstype,$enrollstart,$enrollend, %sections,%crosslistings,%personnel,@baduname,@missingdom,%domconfig,); my $sectotal = $env{'form.sectotal'}; @@ -2848,7 +3139,8 @@ sub print_request_outcome { } my $clonecrs = ''; my $clonedom = ''; - if (($env{'form.clonecrs'} =~ /^($match_courseid)$/) && + if (($env{'form.cloning'}) && + ($env{'form.clonecrs'} =~ /^($match_courseid)$/) && ($env{'form.clonedom'} =~ /^($match_domain)$/)) { my $clonehome = &Apache::lonnet::homeserver($env{'form.clonecrs'}, $env{'form.clonedom'}); @@ -2889,7 +3181,9 @@ sub print_request_outcome { personnel => \%personnel, }; my (@inststatuses,$storeresult,$creationresult); - my $val = &get_processtype($dom,$crstype,\@inststatuses,\%domconfig); + my $val = + &Apache::loncoursequeueadmin::get_processtype($env{'user.name'},$env{'user.domain'}, + $env{'user.adv'},$dom,$crstype,\@inststatuses,\%domconfig); if ($val eq '') { if ($crstype eq 'official') { $output = &mt('You are not permitted to request creation of official courses.'); @@ -2973,18 +3267,6 @@ sub print_request_outcome { if ($result eq 'created') { $disposition = 'created'; $reqstatus = 'created'; - my $parmoutput; - if ($dom eq 'gcitest') { - my $caller = 'requestcrs'; - if ($env{'form.concepttest'} eq 'defchosen') { - &Apache::londocsgci::setdefaults(); - &Apache::londocsgci::evaluate($caller); - &Apache::londocsgci::store($r,$caller,$dom,$cnum); - } - my ($furl,$ferr)= &Apache::lonuserstate::readmap($dom.'/'.$cnum); - my %parmresult = - &store_crsparms($dom,$cnum,$now,$accessstart,$accessend); - } my $role_result = &update_requestors_roles($dom,$cnum,$crstype,$details, \%longroles); if ($crstype eq 'community') { @@ -3017,6 +3299,9 @@ sub print_request_outcome { description => $env{'form.cdescr'}, }, }; + if ($crstype eq 'official') { + $request->{$requestid}->{'instcode'} = $instcode; + } my $statuskey = 'status:'.$dom.':'.$cnum; my %userreqhash = &Apache::lonnet::get('courserequests',[$statuskey], $env{'user.domain'},$env{'user.name'}); @@ -3051,26 +3336,9 @@ sub print_request_outcome { } } } - my ($statusresult); - if ($requestkey =~ /^($match_domain)_($match_courseid)$/) { - $storeresult = &Apache::lonnet::store_userdata(\%reqhash,$requestkey, - 'courserequests'); - if ($storeresult eq 'ok') { - my %status = ( - 'status:'.$dom.':'.$cnum => $reqstatus, - ); - $statusresult = &Apache::lonnet::put('courserequests',\%status); - } - } else { - $storeresult = 'error: invalid requestkey format'; - } - if ($storeresult ne 'ok') { - $output .= '<span class="LC_warning">'.&mt('An error occurred saving a record of the details of your request: [_1].',$storeresult).'</span><br />'; - &Apache::lonnet::logthis("Error saving course request - $requestkey for $env{'user.name'}:$env{'user.domain'} - $storeresult"); - } elsif ($statusresult ne 'ok') { - $output .= '<span class="LC_warning">'.&mt('An error occurred saving a record of the status of your request: [_1].',$statusresult).'</span><br />'; - &Apache::lonnet::logthis("Error saving course request status for $requestkey (for $env{'user.name'}:$env{'user.domain'}) - $statusresult"); - } + ($storeresult,my $updateresult) = + &Apache::loncoursequeueadmin::update_coursereq_status(\%reqhash,$dom, + $cnum,$reqstatus,'request'); if ($modified && $queued && $storeresult eq 'ok') { if ($crstype eq 'community') { $output .= '<p>'.&mt('Your community request has been updated').'</p>'; @@ -3080,7 +3348,10 @@ sub print_request_outcome { $output .= ¬ification_information($disposition,$req_notifylist,$cnum,$now); } if ($validationerror ne '') { - $output .= '<span class="LC_warning">'.&mt('An error occurred validating your request with institutional data sources: [_1].',$validationerror).'</p>'; + $output .= '<p class="LC_warning">'.&mt('An error occurred validating your request with institutional data sources: [_1].',$validationerror).'</p>'; + } + if ($updateresult) { + $output .= $updateresult; } } if ($creationresult ne '') { @@ -3117,7 +3388,14 @@ sub update_requestors_roles { @roles = ($ccrole); } foreach my $role (@roles) { - my $start = $now; + my $refresh=$env{'user.refresh.time'}; + if ($refresh eq '') { + $refresh = $env{'user.login.time'}; + } + if ($refresh eq '') { + $refresh = $now; + } + my $start = $refresh-1; my $end = '0'; if ($role eq 'st') { if ($details->{'accessstart'} ne '') { @@ -3218,49 +3496,6 @@ sub update_requestors_roles { return $output; } -sub store_crsparms { - my ($cdom,$cnum,$now,$accessstart,$accessend) = @_; - my $topsymb = '___0___uploaded/'.$cdom.'/'.$cnum.'/default.sequence'; - my %crsparms = ( - buttonshide => { - value => 'yes', - type => 'string_yesno', - }, - opendate => { - value => $accessstart, - type => 'date_start', - }, - duedate => { - value => $accessend, - type => 'date_end', - }, - problemstatus => { - value => 'no_feedback_ever', - type => 'string_problemstatus', - }, - maxtries => { - value => '1', - type => 'intpos', - }, - discussend => { - value => $now, - type => 'date_end', - }, - discusshide => { - value => 'yes', - type => 'string_yesno', - } - ); - my %parmresult; - foreach my $item (keys(%crsparms)) { - $parmresult{$item} = - &Apache::lonparmset::storeparm_by_symb($topsymb, - '0_'.$item,14,$crsparms{$item}{'value'}, - $crsparms{$item}{'type'},undef,$cdom); - } - return %parmresult; -} - sub notification_information { my ($disposition,$req_notifylist,$cnum,$now) = @_; my %emails = &Apache::loncommon::getemails(); @@ -3292,100 +3527,12 @@ sub notification_information { '</div>'; } else { $output .= '<div class="LC_warning">'. - &mt('Your request status is: [_1].',$disposition). - '</div>' + &mt('Your request status is: [_1].',$disposition). + '</div>'; } return $output; } -sub get_processtype { - my ($dom,$crstype,$inststatuses,$domconfig) = @_; - return unless ((ref($inststatuses) eq 'ARRAY') && (ref($domconfig) eq 'HASH')); - my (%userenv,%settings,$val); - my @options = ('autolimit','validate','approval'); - if ($dom eq $env{'user.domain'}) { - %userenv = - &Apache::lonnet::userenvironment($env{'user.domain'},$env{'user.name'}, - 'requestcourses.'.$crstype,'inststatus'); - if ($userenv{'requestcourses.'.$crstype}) { - $val = $userenv{'requestcourses.'.$crstype}; - @{$inststatuses} = ('_custom_'); - } else { - my ($task,%alltasks); - if (ref($domconfig->{'requestcourses'}) eq 'HASH') { - %settings = %{$domconfig->{'requestcourses'}}; - if (ref($settings{$crstype}) eq 'HASH') { - if (($env{'user.adv'}) && ($settings{$crstype}{'_LC_adv'} ne '')) { - $val = $settings{$crstype}{'_LC_adv'}; - @{$inststatuses} = ('_LC_adv_'); - } else { - if ($userenv{'inststatus'} ne '') { - @{$inststatuses} = split(',',$userenv{'inststatus'}); - } else { - @{$inststatuses} = ('default'); - } - foreach my $status (@{$inststatuses}) { - if (exists($settings{$crstype}{$status})) { - my $value = $settings{$crstype}{$status}; - next unless ($value); - unless (exists($alltasks{$value})) { - if (ref($alltasks{$value}) eq 'ARRAY') { - unless(grep(/^\Q$status\E$/,@{$alltasks{$value}})) { - push(@{$alltasks{$value}},$status); - } - } else { - @{$alltasks{$value}} = ($status); - } - } - } - } - my $maxlimit = 0; - - foreach my $key (sort(keys(%alltasks))) { - if ($key =~ /^autolimit=(\d*)$/) { - if ($1 eq '') { - $val ='autolimit='; - last; - } elsif ($1 > $maxlimit) { - $maxlimit = $1; - } - } - } - if ($maxlimit) { - $val = 'autolimit='.$maxlimit; - } else { - foreach my $option (@options) { - if ($alltasks{$option}) { - $val = $option; - last; - } - } - } - } - } - } - } - } else { - %userenv = &Apache::lonnet::userenvironment($env{'user.domain'}, - $env{'user.name'},'reqcrsotherdom.'.$env{'form.crstype'}); - if ($userenv{'reqcrsotherdom.'.$crstype}) { - my @doms = split(',',$userenv{'reqcrsotherdom.'.$crstype}); - my $optregex = join('|',@options); - foreach my $item (@doms) { - my ($extdom,$extopt) = split(':',$item); - if ($extdom eq $dom) { - if ($extopt =~ /^($optregex)(=?\d*)$/) { - $val = $1.$2; - } - last; - } - } - @{$inststatuses} = ('_external_'); - } - } - return $val; -} - sub check_autolimit { my ($uname,$udom,$dom,$crstype,$limit,$message) = @_; my %crsroles = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},