--- loncom/interface/lonrequestcourse.pm 2010/11/29 04:40:12 1.41.2.9 +++ loncom/interface/lonrequestcourse.pm 2010/03/30 16:08:10 1.50 @@ -1,7 +1,7 @@ # The LearningOnline Network # Request a course # -# $Id: lonrequestcourse.pm,v 1.41.2.9 2010/11/29 04:40:12 raeburn Exp $ +# $Id: lonrequestcourse.pm,v 1.50 2010/03/30 16:08:10 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() @@ -128,42 +126,23 @@ sub handler { if ($r->header_only) { return OK; } - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['action','showdom','cnum','state','crstype']); - &Apache::lonhtmlcommon::clear_breadcrumbs(); - my $action = $env{'form.reqaction'}; - my $state = $env{'form.state'}; - my $context; - &generate_page($r,$action,$state,$context); - return OK; -} -sub generate_page { - my ($r,$action,$state,$context) = @_; &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'}; + my $state = $env{'form.state'}; my (%states,%stored); my ($jscript,$uname,$udom,$result,$warning); $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 ($env{'form.concepttest'} eq 'editmyown') { - push(@{$states{'new'}},'chooseitems','uploadroster','enrolling'); - } elsif (($env{'form.concepttest'} eq 'defchosen') || - (($env{'form.concepttest'} eq 'cloning') && (!$env{'form.cloneroster'}))) { - push(@{$states{'new'}},'uploadroster','enrolling'); - } else { - push(@{$states{'new'}},'done'); - } - } if (($action eq 'new') && ($env{'form.crstype'} eq 'official')) { - unless ($state eq 'crstype') { + unless ($env{'form.state'} eq 'crstype') { unshift(@{$states{'new'}},'codepick'); } } @@ -187,15 +166,8 @@ sub generate_page { details => 'Request Details', cancel => 'Cancel Request', removal => 'Outcome', - chooseitems => 'Saved Test', - uploadroster => 'Upload Roster', - enrolling => 'Completed', - done => 'Completed', + 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'; @@ -205,10 +177,10 @@ sub generate_page { &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 = @@ -301,7 +273,7 @@ sub generate_page { $env{'form.clonedom'} = $dom; } if ($state eq 'crstype') { - $jscript = &mainmenu_javascript($action); + $jscript = &mainmenu_javascript(); } else { $jscript = &Apache::lonhtmlcommon::set_form_elements($elementsref,\%stored); if ($state eq 'courseinfo') { @@ -314,7 +286,7 @@ sub generate_page { $jscript .= "\n".&Apache::loncommon::userbrowser_javascript(); } - my $loaditems = &onload_action($action,$state,$dom); + my $loaditems = &onload_action($action,$state); my (%can_request,%request_domains); my $canreq = @@ -329,10 +301,6 @@ sub generate_page { $jscript,$loaditems,$crumb,$newinstcode, $codechk,$checkedcode,$description, \@invalidcrosslist); - if ($state eq 'chooseitems' || $state eq 'uploadroster' || - $state eq 'enrolling') { - return $canreq; - } } } else { $r->print(&header('Course/Community Requests').$crumb. @@ -350,7 +318,7 @@ sub generate_page { } 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. '

'.&mt('Course/Community Request Details').'

'. '
'.$warning.'
'. &close_popup_form()); @@ -359,15 +327,31 @@ sub generate_page { $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 .= < 1) { + if (courseForm.cloning.length > 1) { for (var i=0; i 'requestcrs', - uploadroster => 'studentform', - enrolling => 'requestcrs', - done => 'requestcrs', - ); - my $lastidx; - for (my $i=0; $i<@{$states->{$action}}; $i++) { - if ($$state eq $states->{$action}[$i]) { - $lastidx = $i; - last; - } - } for (my $i=0; $i<@{$states->{$action}}; $i++) { 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')) { @@ -483,43 +446,22 @@ sub get_breadcrumbs { } ); } else { - if (($$state eq 'chooseitems') || ($$state eq 'uploadroster') || - ($$state eq 'enrolling') || ($$state eq 'done')) { - if (($states->{$action}[$i] ne 'process') && - ($states->{$action}[$i] ne 'chooseitems') && - ($states->{$action}[$i] ne 'uploadroster') && - ($states->{$action}[$i] ne 'enrolling') && - ($states->{$action}[$i] ne 'done')) { - &Apache::lonhtmlcommon::add_breadcrumb( - { href => '/adm/requestcourse', - text => "$trail->{$states->{$action}[$i]}", - } - ); - } else { - my $diff = $i-$lastidx; - &Apache::lonhtmlcommon::add_breadcrumb( - { href => "javascript:history.go($diff)", - text => "$trail->{$states->{$action}[$i]}", } - ); - } - } else { - &Apache::lonhtmlcommon::add_breadcrumb( + &Apache::lonhtmlcommon::add_breadcrumb( { href => "javascript:backPage(document.requestcrs,'$states->{$action}[$i]')", text => "$trail->{$states->{$action}[$i]}", } - ); - } - } - } - } + ); + } + } + } } 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); } @@ -535,13 +477,11 @@ sub header { if (ref($args) eq 'HASH') { my %loadhash = ( 'add_entries' => $loaditems, - 'function' => 'norole', ); my %arghash = (%loadhash,%{$args}); - $args = \%arghash; + $args = \%arghash; } else { - $args = {'add_entries' => $loaditems, - 'function' => 'norole'}; + $args = {'add_entries' => $loaditems,}; } } return &Apache::loncommon::start_page($bodytitle,$jscript.$jsextra,$args); @@ -559,7 +499,7 @@ sub form_elements { }, courseinfo => { cdescr => 'text', - cloning => 'radio', + cloning => 'radio', clonecrs => 'text', clonedom => 'selectbox', datemode => 'radio', @@ -595,28 +535,12 @@ sub form_elements { }, ); my %servers = &Apache::lonnet::get_servers($dom,'library'); - if ($dom eq 'gcitest') { - %{$elements{'new'}{'courseinfo'}} = ( - cdescr => 'text', - concepttest => 'radio', - ); - $elements{'new'}{'enrollment'}{'timezone'} = 'selectbox'; - if (&show_cloneable()) { - $elements{'new'}{'courseinfo'}{'clonecrs'} = 'selectbox'; - $elements{'new'}{'courseinfo'}{'clonedom'} = 'hidden'; - $elements{'new'}{'courseinfo'}{'cloneroster'} = 'checkbox'; - } - } 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); @@ -713,6 +637,9 @@ sub onload_action { } else { $loaditems{'onload'} = 'javascript:setFormElements(document.requestcrs);'; } + if ($state eq 'courseinfo') { + $loaditems{'onload'} .= 'javascript:setCloneDisplay(document.requestcrs);'; + } } return \%loaditems; } @@ -738,13 +665,11 @@ 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; - var actionchoice = document.mainmenu_action.reqaction.value; + var actionchoice = document.mainmenu_action.action.value; if (check_can_request(crschoice,actionchoice) == true) { if ((actionchoice == 'new') && (crschoice == 'official')) { nextstate = 'codepick'; @@ -752,7 +677,7 @@ function nextPage(formname) { $nextstate_setter } formname.crstype.value = crschoice; - formname.reqaction.value = actionchoice; + formname.action.value = actionchoice; formname.state.value= nextstate; formname.submit(); } @@ -764,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 .= < '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 .= <{'official'}) || ($can_request->{'unofficial'})) { @@ -829,41 +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. - '

'.&mt('Deployment of a Concept Test requires completion of the following three steps:').'

    '. - '
  1. '.&mt('Creation of a course "container" and setting of access dates').'
  2. '. - '
  3. '.&mt('Assembly of a valid test from Concept Inventory questions').'
  4. '. - '
  5. '.&mt('Enrollment of students').'
  6. '. - '

'.&mt('When assembling a test you may:'). - '
'.&mt('(a) have a valid test built automatically by the WebCenter, or').'
'.&mt('(b) select the questions to include by combining questions chosen from eleven bins with four mandatory questions, or'). - '
'.&mt('(c) copy one of your existing tests (including optional copying of the student roster)').'

'.&mt('The most efficient way to enroll students is to upload a text file containing usernames and passwords.').'
'.&mt("Students' e-mail addresses must be used as their usernames to ensure uniqueness.").'

'. - '
'."\n". - ''."\n". - ''."\n". - ''."\n". - ''."\n". - ''."\n". - '
'. - &Apache::loncommon::end_page()); - return; - } - - if (!$onchange) { - $r->print(' '); - } - unless ((ref($can_request) eq 'HASH') && (keys(%{$can_request}) > 0)) { - $r->print(&Apache::lonhtmlcommon::row_closure(1)."\n". - &Apache::lonhtmlcommon::end_pick_box().''."\n". - &Apache::loncommon::end_page()); - return; - } - my @incdoms; if (ref($request_domains) eq 'HASH') { foreach my $item (keys(%{$request_domains})) { @@ -898,12 +787,12 @@ END my $nexttext = &mt('Next'); $r->print(&Apache::lonhtmlcommon::row_title(&mt('Action')).'
-
'. - &Apache::lonhtmlcommon::row_closure(1). + &Apache::lonhtmlcommon::row_closure(). &Apache::lonhtmlcommon::row_title(&mt('Type')).'
'."\n". ''."\n". ''."\n". - ''."\n". + ''."\n". ''."\n". '
'); @@ -962,13 +851,8 @@ END if (($action eq 'new') || ($action eq 'view')) { $js .= <print(&header($title,$js.$jscript,$loaditems,$jsextra).$crumb); - return if (($state eq 'chooseitems') || ($state eq 'uploadroster') || - ($state eq 'enrolling')); &print_request_form($r,$action,$state,$page,$states,$dom,$newinstcode, $codechk,$checkedcode,$description,$invalidcrosslist); } elsif ($action eq 'view') { @@ -1035,7 +913,7 @@ END $title = &mt('Pending course/community requests'); } $r->print('

'.$title.'

'."\n".$form."\n". - &print_request_status($dom,$action,$state).'
'); + &print_request_status($dom,$action).''); } elsif ($state eq 'details') { my (@codetitles,%cat_titles,%cat_order,@code_order,$instcode,$code_chk); my $origcnum = $env{'form.cnum'}; @@ -1121,7 +999,7 @@ END } $r->print('

'.&mt('Request Cancellation').'

'."\n".$form."\n". ''."\n". - ''."\n". + ''."\n". ''."\n". ''."\n"); if ($result eq 'ok') { @@ -1157,8 +1035,6 @@ END &print_review($dom,\@codetitles,\%cat_titles,\%cat_order, \@code_order,$uname,$udom)."\n".'
'. &close_popup_form()); - } elsif ($action eq 'log') { - $r->print(&coursereq_log('View request log',$jscript,$loaditems).$crumb); } $r->print(&Apache::loncommon::end_page()); return; @@ -1404,29 +1280,29 @@ sub print_request_form { &Apache::lonhtmlcommon::end_pick_box().''); } else { $next = $states->{$action}[$page+2]; - $r->print(&courseinfo_form($dom,$formname,$state,$crstype,$next)); + $r->print(&courseinfo_form($dom,$formname,$crstype,$next)); } } else { if ($crstype eq 'official') { $next = $states->{$action}[$page+2]; } - $r->print(&courseinfo_form($dom,$formname,$state,$crstype,$next)); + $r->print(&courseinfo_form($dom,$formname,$crstype,$next)); } } elsif ($prev eq 'codepick') { if ($instcode eq '') { $prev = $states->{$action}[$page-2]; } - $r->print(&courseinfo_form($dom,$formname,$state,$crstype,$next,$description)); + $r->print(&courseinfo_form($dom,$formname,$crstype,$next,$description)); } elsif ($state eq 'enrollment') { if ($crstype eq 'official') { &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles, \%cat_order,\@code_order); } - $r->print(&print_enrollment_menu($formname,$state,$instcode,$dom,\@codetitles, + $r->print(&print_enrollment_menu($formname,$instcode,$dom,\@codetitles, \%cat_titles,\%cat_order,\@code_order, $invalidcrosslist)); } elsif ($state eq 'personnel') { - $r->print(&print_personnel_menu($dom,$formname,$state,$crstype,$invalidcrosslist)); + $r->print(&print_personnel_menu($dom,$formname,$crstype,$invalidcrosslist)); } elsif ($state eq 'review') { my (%alerts,%rulematch,%inst_results,%curr_rules,%got_rules,%disallowmsg); my $now = time; @@ -1505,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); @@ -1521,13 +1401,13 @@ sub print_request_form { } else { $navtxt{'next'} = &mt('Submit course request'); } - } elsif ($state eq 'process') { + } elsif ($state eq 'process') { if ($crstype eq 'official') { &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles, \%cat_order,\@code_order); } - my ($storeresult,$result) = &print_request_outcome($r,$dom,\@codetitles, - \@code_order,$formname); + my ($storeresult,$result) = &print_request_outcome($dom,\@codetitles, + \@code_order); $r->print($result); if (($storeresult eq 'ok') || ($storeresult eq 'created')) { $r->print('

'); @@ -1535,13 +1415,9 @@ sub print_request_form { $r->print(''. &mt('Modify this request').''.(' 'x4)); } - unless ($env{'form.concepttest'}) { - $r->print(''.&mt('Make another request').'

'); - } + $r->print(''.&mt('Make another request').'

'); return; } - } elsif ($state eq 'uploadroster') { - &roster_upload_form($r,$output,$formname); } my @excluded = &get_excluded_elements($dom,$states,$action,$state); if ($state eq 'personnel') { @@ -1576,39 +1452,12 @@ sub print_request_form { if ($state eq 'enrollment') { push(@excluded,'crosslisttotal'); } - if ($state eq 'done') { - $r->print(&done_display()); - } else { - $r->print(&Apache::lonhtmlcommon::echo_form_input(\@excluded)); - &display_navbuttons($r,$dom,$formname,$prev,$navtxt{'prev'},$next, - $navtxt{'next'},$state); - } - $r->print(''); + $r->print(&Apache::lonhtmlcommon::echo_form_input(\@excluded).''); + &display_navbuttons($r,$dom,$formname,$prev,$navtxt{'prev'},$next, + $navtxt{'next'},$state); return; } -sub done_display { - return '

'.&mt('Concept Test creation is complete').'

'. - '

'.&mt('The following management tools are available via the "[_1]Manage Tests[_2]" tab, or from the toolbar on the [_3]Concept Test Contents[_4] page.[_5]', - '','','','','
'). - '

'. - '
'.&mt('Concept Test Contents').'
'. - '
'.&mt('Display the Table of Contents for your Concept Test.').'
'. - '
'.&mt('Assemble Concept Test').'
'. - '
'.&mt('If no students have attempted the Concept Test you will be able to modify it. You can also change the start and end date of the test itself.').'
'. - '
'. - '
'.&mt('Enrollment and Student Activity').'
'. - '
'.&mt('Display or download a course roster, and view information about completion status and last login. You can also add new students, or change access dates for existing students.').'
'. - '
'.&mt("What's New?").'
'. - '
'.&mt('View information about changes in your Concept Test course.').'
'. - '
'. - '
'.&mt('Prepare Printable Concept Test').'
'. - '
'.&mt('Create a PDF which you can send to a printer to create a hardcopy of the Concept Test.').'
'. - '
'.&mt('Concept Test Statistics').'
'. - '
'.&mt('After the closing date of the Concept Test you can view and download statistics for the test, as well as anonymized submission data.').'
'. - '

'; -} - sub get_cancreate_status { my ($persondom,$personname,$dom) = @_; my ($rules,$ruleorder) = @@ -1673,25 +1522,16 @@ sub get_excluded_elements { if (grep(/^instcode_/,@excluded)) { push(@excluded,'instcode'); } - if ($env{'form.initmap'}) { - push(@excluded,'initmap'); - } - if ($env{'form.output'}) { - push(@excluded,'output'); - } return @excluded; } sub print_enrollment_menu { - my ($formname,$state,$instcode,$dom,$codetitles,$cat_titles,$cat_order, - $code_order,$invalidcrosslist) =@_; + my ($formname,$instcode,$dom,$codetitles,$cat_titles,$cat_order,$code_order, + $invalidcrosslist) =@_; my ($sections,$autoenroll,$access_dates,$output,$hasauto); my $starttime = time; - my $diff = 6*30*24*60*60; # 6 months from now, approx - if (&Apache::loncommon::needs_gci_custom()) { - $diff = 7*24*60*60; # 7 days from now, approx - } - my $endtime = $starttime+$diff; + my $endtime = time+(6*30*24*60*60); # 6 months from now, approx + my %accesstitles = ( 'start' => 'Default start access', 'end' => 'Default end access', @@ -1728,7 +1568,7 @@ sub print_enrollment_menu { &Apache::lonhtmlcommon::row_title(&mt('Add another')). ''. ''.&mt('Add?').&Apache::lonhtmlcommon::row_closure(); $sections .= &Apache::lonhtmlcommon::row_headline. '

'.&mt('Crosslisted courses for auto-enrollment').'

'. @@ -1739,25 +1579,26 @@ sub print_enrollment_menu { $autoenroll = &Apache::lonhtmlcommon::row_title(&Apache::loncommon::help_open_topic('Course_Request_Autoadd').' '.&mt('Add registered students automatically')). ''.(' 'x3).''. &Apache::lonhtmlcommon::row_closure(1). &Apache::lonhtmlcommon::row_title(&Apache::loncommon::help_open_topic('Course_Request_Autodrop').' '.&mt('Drop unregistered students automatically')). ''.(' 'x3).''. &Apache::lonhtmlcommon::row_closure(1). &date_setting_table($starttime,$endtime,$formname,'enroll', - $hasauto,$dom,%enrolltitles); + $hasauto,%enrolltitles); } } my $access_dates = &date_setting_table($starttime,$endtime,$formname,'access',$hasauto, - $dom,%accesstitles); + %accesstitles); + $output .= &Apache::lonhtmlcommon::start_pick_box(); if ($sections) { $output .= $sections; } @@ -1774,23 +1615,11 @@ sub print_enrollment_menu { } $output .= &Apache::lonhtmlcommon::row_headline('Access'). '

'.$header.'

'. - &Apache::lonhtmlcommon::row_closure(1); - if ($dom eq 'gcitest') { - my $includeempty = 1; - my $timezone = &Apache::lonlocal::gettimezone(); - $output .= &Apache::lonhtmlcommon::row_title('Time zone'). - &Apache::loncommon::select_timezone('timezone',$timezone, - undef,$includeempty). - &Apache::lonhtmlcommon::row_closure(1); - } - $output .= $access_dates; - } - if ($dom eq 'gcitest') { - return $output; - } else { - return '
'.&Apache::lonhtmlcommon::start_pick_box().$output. - &Apache::lonhtmlcommon::end_pick_box().'
'; + &Apache::lonhtmlcommon::row_closure(1). + $access_dates } + return '
'.&Apache::lonhtmlcommon::start_pick_box().$output. + &Apache::lonhtmlcommon::end_pick_box().'
'; } sub show_invalid_crosslists { @@ -1852,29 +1681,17 @@ sub inst_section_selector { } sub date_setting_table { - my ($starttime,$endtime,$formname,$prefix,$hasauto,$dom,%datetitles) = @_; + my ($starttime,$endtime,$formname,$prefix,$hasauto,%datetitles) = @_; my ($perpetual,$table); - my $no_hh_mm_ss = 1; - my $hide_timezone; - if (&Apache::loncommon::needs_gci_custom()) { - $no_hh_mm_ss = ''; - if ($dom eq 'gcitest') { - if ($prefix eq 'access') { - $hide_timezone = 1; - } - } - } my $startform = &Apache::lonhtmlcommon::date_setter($formname,$prefix.'start', - $starttime,'','','',$no_hh_mm_ss,'','','',1,$hide_timezone); + $starttime,'','','',1,'','','',1); my $endform = &Apache::lonhtmlcommon::date_setter($formname,$prefix.'end', - $endtime,'','','',$no_hh_mm_ss,'','','',1,$hide_timezone); + $endtime,'','','',1,'','','',1); my $closure = ''; if ($prefix eq 'access') { - unless (&Apache::loncommon::needs_gci_custom()) { - $perpetual = ' '; - } + $perpetual = ' '; $closure = '1'; } @@ -1894,16 +1711,16 @@ 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; } sub print_personnel_menu { - my ($dom,$formname,$state,$crstype,$invalidcrosslist) = @_; + my ($dom,$formname,$crstype,$invalidcrosslist) = @_; my $output; if ($crstype eq 'official') { if (&Apache::lonnet::auto_run('',$dom)) { @@ -2016,7 +1833,7 @@ sub print_personnel_menu { $output .= &Apache::lonhtmlcommon::row_title(&mt('Add another')). ''. ''.&mt('Add?').&Apache::lonhtmlcommon::row_closure(1). &Apache::lonhtmlcommon::end_pick_box().''; if ($crstype eq 'community') { @@ -2044,53 +1861,95 @@ sub current_lc_sections { return @currsecs; } -sub print_request_status { - my ($dom,$action,$state) = @_; +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 = ''."\n". + my $formname = 'requestcrs'; + my ($types,$typenames) = &Apache::loncommon::course_types(); + my $output = ''."\n". - ''."\n". + ''."\n". ''."\n". ''."\n". ''."\n"; @@ -2237,7 +2096,7 @@ sub viewdetails_javascript { function nextPage(formname,nextstate) { if (nextstate == "modify") { formname.state.value = "personnel"; - formname.reqaction.value = "new"; + formname.action.value = "new"; } else { formname.state.value = nextstate; } @@ -2268,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('
'."\n". + ''."\n". + ''."\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(''. + &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(). + ' '.&mt('Request Date').''. + ''.&mt('Description').''; + if ($curr{'crstype'} eq 'any') { + $tablehdr .= ''.&mt('Course Type').''; + } + if (($curr{'crstype'} eq 'official') || ($curr{'crstype'} eq 'any')) { + $tablehdr .= ''.&mt('Institutional Code').''; + } + if ($curr{'status'} eq 'any') { + $tablehdr .= ''.&mt('Status').''; + } elsif ($curr{'status'} eq 'created') { + $tablehdr .= ''.&mt('Creation Date').''; + } elsif ($curr{'status'} eq 'cancelled') { + $tablehdr .= ''.&mt('Cancellation Date').''; + } elsif ($curr{'status'} eq 'rejected') { + $tablehdr .= ''.&mt('Rejection Date').''; + } + $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(). + ''.$count.''. + ''.$showtime.''. + ''.&unescape($desc).''; + if ($curr{'crstype'} eq 'any') { + my $typename; + if (ref($typenames) eq 'HASH') { + $typename = &mt($typenames->{$crstype}); + } + if ($typename eq '') { + $typename = &mt('Unknown type'); + } + $output .= ''.$typename.''; + } + if (($curr{'crstype'} eq 'any') || + ($curr{'crstype'} eq 'official')) { + my $showinstcode; + if ($crstype eq 'official') { + $showinstcode = &unescape($instcode); + } else { + $showinstcode = &mt('Not applicable'); + } + $output .= ''.$showinstcode.''; + } + 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 .= ''.$statusname.''; + } elsif (($status eq 'created') || ($status eq 'cancelled') || + ($status eq 'rejected')) { + $output .= ''.&Apache::lonlocal::locallocaltime($timestamp).''; + } + $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(''); + if ($curr{'page'} > 1) { + $r->print(''); + } + if ($more_records) { + $r->print(''); + } + $r->print('
'.&mt('Previous [_1] changes',$curr{'show'}).''.&mt('Next [_1] changes',$curr{'show'}).'
'); + $r->print(<<"ENDSCRIPT"); + +ENDSCRIPT + } + } else { + $norecords = 1; + } + } else { + $norecords = 1; + } + if ($norecords) { + $r->print('

'. + &mt('There are no records to display'). + '

'); + } + $r->print('
'. + &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 = ''; + 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 .= ''. + ''; + my ($types,$typenames) = &Apache::loncommon::course_types(); + if (ref($types) eq 'ARRAY') { + if (@{$types} > 1) { + $output .= ''; + } + } + my ($statuses,$statusnames) = &reqstatus_names($curr->{'crstype'}); + if (ref($statuses) eq 'ARRAY') { + if (@{$statuses} > 1) { + $output .= ''; + } + } + $output .= '
'. + ''.&mt('Records/page:').'
'. + &Apache::lonmeta::selectbox('show',$curr->{'show'},undef, + (&mt('all'),5,10,20,50,100,1000,10000)). + '
  '.&mt('Window during which course/community was requested:').'
'. + ''. + ''. + '
'.&mt('After:'). + ''.$startform.'
'.&mt('Before:').''.$endform.'
'. + '
  '. + &mt('Course Type:').'
'. + &mt('Request Status:').'
'; + + # Update Display button + $output .= '

'. + ''. + '


'; + return $output; +} + sub print_review { my ($dom,$codetitles,$cat_titles,$cat_order,$code_order,$uname,$udom, $disallowed,$disallowmsg) = @_; @@ -2394,92 +2534,51 @@ sub print_review { } my %ctxt = &clone_text(); - if ($dom eq 'gcitest') { - $inst_headers .= ''.&mt('Test Questions').''; - my $concepttest; - if ($env{'form.concepttest'} eq 'defchosen') { - $concepttest = 'Auto-generated'; - } elsif ($env{'form.concepttest'} eq 'editmyown') { - $concepttest = 'Manually selected'; - } elsif ($env{'form.concepttest'} eq 'cloning') { - $concepttest = 'Copied from existing test'; - } - $inst_values .= ''.$concepttest.(' 'x2).''; - } - if (&show_cloneable()) { - $inst_headers .= ''.&mt('Copy From').''; - if ((($env{'form.cloning'}) || - (($dom eq 'gcitest') && ($env{'form.concepttest'} eq 'cloning'))) && - ($env{'form.clonecrs'} =~ /^$match_name$/) && - ($env{'form.clonedom'} =~ /^$match_domain$/)) { - my $canclone = &Apache::loncoursequeueadmin::can_clone_course($env{'user.name'}, + $inst_headers .= ''.&mt('Clone From').''; + 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) { - if ($dom eq 'gcitest') { - $inst_headers .= ''.$ctxt{'ros'}.''; - } else { - $inst_headers .= ''.$ctxt{'dsh'}.''; - } - $inst_values .= ''.$courseenv{'description'}.' '; - my $cloneinst = $courseenv{'internal.coursecode'}; - if ($cloneinst ne '') { - $inst_values .= $cloneinst.' '.&mt('in').' '.$env{'form.clonedom'}; - } else { - unless ($dom eq 'gcitest') { - $inst_values .= &mt('from').' '.$env{'form.clonedom'}; - } - } - $inst_values .= (' 'x2).''; - if ($dom eq 'gcitest') { - if ($env{'form.cloneroster'}) { - $inst_values .= &mt('Yes'); - } else { - $inst_values .= &mt('No'); - } - } else { - 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 .= ''; - } else { - $inst_values .= ''.&mt('Unknown').''; - } + if (keys(%courseenv) > 0) { + $inst_headers .= ''.$ctxt{'dsh'}.''; + $inst_values .= ''.$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 .= ''; + 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 .= ''; } else { - $inst_values .= ''.&mt('Not permitted'),''; + $inst_values .= ''.&mt('Unknown').''; } - } else { - $inst_values .= ''.&mt('None').''; - } - } - my $tz; - if ($dom eq 'gcitest') { - if (&Apache::lonlocal::gettimezone($env{'form.timezone'}) ne 'local') { - $tz = $env{'form.timezone'}; - } else { - $tz = &Apache::lonlocal::gettimezone(); - } - $enroll_headers .= ''.&mt('Time Zone').''; + } else { + $inst_values .= ''.&mt('Not permitted'),''; + } + } else { + $inst_values .= ''.&mt('None').''; } $enroll_headers .= ''.&mt('Access Starts').''. ''.&mt('Access Ends').''; - my ($accessstart,$accessend) = &dates_from_form('accessstart','accessend',$tz); - if ($dom eq 'gcitest') { - $enroll_values .= ''.$tz.''; - } - $enroll_values .= ''.&Apache::lonlocal::locallocaltime($accessstart,$tz).''; + my ($accessstart,$accessend) = &dates_from_form('accessstart','accessend'); + $enroll_values .= ''.&Apache::lonlocal::locallocaltime($accessstart).''; if ($accessend == 0) { $enroll_values .= ''.&mt('No end date').''; } else { - $enroll_values .= ''.&Apache::lonlocal::locallocaltime($accessend,$tz).''; + $enroll_values .= ''.&Apache::lonlocal::locallocaltime($accessend).''; } my $container = 'Course'; @@ -2590,9 +2689,9 @@ sub print_review { } sub dates_from_form { - my ($startname,$endname,$timezone) = @_; - my $startdate = &Apache::lonhtmlcommon::get_date_from_form($startname,$timezone); - my $enddate = &Apache::lonhtmlcommon::get_date_from_form($endname,$timezone); + my ($startname,$endname) = @_; + my $startdate = &Apache::lonhtmlcommon::get_date_from_form($startname); + my $enddate = &Apache::lonhtmlcommon::get_date_from_form($endname); if ($endname eq 'accessend') { if (exists($env{'form.no_end_date'}) ) { $enddate = 0; @@ -2602,7 +2701,7 @@ sub dates_from_form { } sub courseinfo_form { - my ($dom,$formname,$state,$crstype,$next,$description) = @_; + my ($dom,$formname,$crstype,$next,$description) = @_; my %lt = &Apache::lonlocal::texthash( official => 'You must provide a (brief) course description.', community => 'You must provide a (brief) community description.' @@ -2642,32 +2741,17 @@ function toggleCloning() { 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('Copy content and settings from an existing course?'); + my $clonetitle = &mt('Clone content and settings from an existing course?'); if ($crstype eq 'community') { $title = &mt('Brief Community Description'); - $clonetitle = &mt('Copy content and settings from an existing community?'); + $clonetitle = &mt('Clone content and settings from an existing community?'); } my $output .= $js_validate."\n".&Apache::lonhtmlcommon::start_pick_box(). &Apache::lonhtmlcommon::row_headline(). '

'.&Apache::loncommon::help_open_topic('Course_Request_Description').' '.$title.'

'. &Apache::lonhtmlcommon::row_closure(1). - &Apache::lonhtmlcommon::row_title($desctitle). - ''; - my $showclone; - if ($dom eq 'gcitest') { - $showclone = &show_cloneable(); - } else { - $showclone = 1; - } - if ($dom eq 'gcitest') { - $output .= &Apache::lonhtmlcommon::row_closure(1). - &concepttest_form($showclone); - } + &Apache::lonhtmlcommon::row_title(&mt('Description')). + ''; my ($home_server_pick,$numlib) = &Apache::loncommon::home_server_form_item($dom,'chome', 'default','hide'); @@ -2676,82 +2760,24 @@ ENDJS &Apache::lonhtmlcommon::row_title(&mt('Home Server for Course')); } $output .= $home_server_pick. - &Apache::lonhtmlcommon::row_closure(); - if ($showclone && $dom ne 'gcitest') { - $output .= &Apache::lonhtmlcommon::row_headline(). - '

'.&Apache::loncommon::help_open_topic('Course_Request_Clone').' '.$clonetitle. - ''. - '

'. - &Apache::lonhtmlcommon::row_closure(1). - &Apache::lonhtmlcommon::row_headline(). - ''; - } - if ($dom eq 'gcitest') { - my ($instcode,@codetitles,%cat_titles,%cat_order,@code_order); - my $invalidcrosslist = []; - $output .= &print_enrollment_menu($formname,$state,$instcode,$dom, - \@codetitles,\%cat_titles,\%cat_order, - \@code_order,$invalidcrosslist); - } - $output .= &Apache::lonhtmlcommon::end_pick_box()."\n"; - return $output; -} - -sub concepttest_form { - my ($showclone) = @_; - my $output = &Apache::lonhtmlcommon::row_title(&mt('Questions included in Concept Test')). - '
'. - ''; - if ($showclone) { - $output .= '
'.&select_oldtest().(' ' x2). - ''. - ''; - } - return $output; -} - -sub select_oldtest { - my $output = ''; + &Apache::lonhtmlcommon::row_closure(). + &Apache::lonhtmlcommon::row_headline(). + '

'.&Apache::loncommon::help_open_topic('Course_Request_Clone').' '.$clonetitle. + &Apache::lonhtmlcommon::row_closure(1). + &Apache::lonhtmlcommon::row_title(&mt('Clone?')). + ''. + '

'. + &Apache::lonhtmlcommon::row_closure(1). + &Apache::lonhtmlcommon::row_headline(). + ''. + &Apache::lonhtmlcommon::end_pick_box()."\n"; return $output; } @@ -2788,16 +2814,15 @@ sub clone_text { 'dmn' => 'Domain', 'dsh' => 'Date Shift', 'ncd' => 'Do not clone date parameters', - 'prd' => 'Copy date parameters as-is', + 'prd' => 'Clone date parameters as-is', 'shd' => 'Shift date parameters by number of days', - 'ros' => 'Copy Roster', ); } 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', ); @@ -2977,7 +3002,7 @@ sub display_navbuttons { } sub print_request_outcome { - my ($r,$dom,$codetitles,$code_order,$formname) = @_; + 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'}; @@ -3014,10 +3039,6 @@ sub print_request_outcome { push(@instsections,$sec); } $sections{$i}{'loncapa'} = $env{'form.loncapasec_'.$i}; - $sections{$i}{'loncapa'} =~ s/\W//g; - if ($sections{$i}{'loncapa'} eq 'none') { - $sections{$i}{'loncapa'} = ''; - } } } } @@ -3099,7 +3120,7 @@ sub print_request_outcome { push(@baduname,$uname.':'.$udom); } } - my ($accessstart,$accessend) = &dates_from_form('accessstart','accessend',$env{'form.timezone'}); + my ($accessstart,$accessend) = &dates_from_form('accessstart','accessend'); my $autodrops = 0; if ($env{'form.autodrops'}) { $autodrops = $env{'form.autodrops'}; @@ -3117,16 +3138,12 @@ sub print_request_outcome { } my $clonecrs = ''; my $clonedom = ''; - if ((($env{'form.cloning'}) || - (($dom eq 'gcitest') && ($env{'form.concepttest'} eq 'cloning'))) && + if (($env{'form.cloning'}) && ($env{'form.clonecrs'} =~ /^($match_courseid)$/) && ($env{'form.clonedom'} =~ /^($match_domain)$/)) { - if ($dom eq 'gcitest') { - $env{'form.clonedom'} = 'gcitest'; - } my $clonehome = &Apache::lonnet::homeserver($env{'form.clonecrs'}, $env{'form.clonedom'}); - if ($clonehome ne 'no_host') { + if ($clonehome ne 'no_host') { my $canclone = &Apache::loncoursequeueadmin::can_clone_course($env{'user.name'}, $env{'user.domain'},$env{'form.clonecrs'},$env{'form.clonedom'}, @@ -3162,28 +3179,10 @@ sub print_request_outcome { accessend => $accessend, personnel => \%personnel, }; - if ($dom eq 'gcitest') { - - if ($env{'form.concepttest'} eq 'editmyown') { - $details->{'firstres'} = 'nav'; - } else { - $details->{'firstres'} = 'blank'; - } - if ($env{'form.concepttest'} eq 'cloning') { - if (($clonecrs) && ($clonedom eq 'gcitest')) { - $details->{'cloneroster'} = $env{'form.cloneroster'}; - } else { - $details->{'clonedom'} = 'gci'; - $details->{'clonecrs'} = '8v226795a882b4bcagcil1'; - } - } else { - $details->{'clonedom'} = 'gci'; - $details->{'clonecrs'} = '8v226795a882b4bcagcil1'; - } - $details->{'datemode'} = 'delete'; - } - my (@inststatuses,$storeresult,$creationresult,$donedisplay); - my $val = &get_processtype($dom,$crstype,\@inststatuses,\%domconfig); + my (@inststatuses,$storeresult,$creationresult); + 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.'); @@ -3274,78 +3273,7 @@ sub print_request_outcome { } else { $output = '

'.&mt('Your course request has been processed and the course has been created.'); } - if ($dom eq 'gcitest') { - my $caller = 'requestcrs'; - my $timezone; - if (&Apache::lonlocal::gettimezone($env{'form.timezone'}) ne 'local') { - $timezone = $env{'form.timezone'}; - } else { - $timezone = Apache::lonlocal::gettimezone(); - } - &acquire_cc_role($dom,$cnum,'cc./'.$dom.'/'.$cnum); - my %parmresult = - &store_crsparms($dom,$cnum,$now,$accessstart,$accessend); - &Apache::londocsgci::setdefaults(); - my %crsenvhash = ( - suppress_tries => 'yes', - timezone => $timezone, - ); - my $putresult = &Apache::lonnet::put('environment',\%crsenvhash,$dom,$cnum); - if ($env{'form.concepttest'} eq 'cloning') { - &Apache::lonuserstate::readmap($dom.'/'.$cnum); - if (($clonecrs) && ($clonedom eq 'gcitest')) { - my $cloneid = $clonedom.'/'.$clonecrs; - my %clonedesc = &Apache::lonnet::coursedescription($cloneid,{'one_time' => 1}); - my $oldcdesc = $clonedesc{'description'}; - $output .= '
'.&mt('A concept test has been copied from your existing test: [_1].',''.$oldcdesc.'').'

'; - if ($env{'form.cloneroster'}) { - $output .= '
'.&mt('You requested copying of the old student roster to the new course.'); - if ($logmsg =~ /\Q\0\E/) { - my @logging = split("\0",$logmsg); - if (@logging) { - $output .= '

'.$logging[-1].'

'; - } - } - $output .= '
    '. - '
  • '.&mt('Access starts:').' '. - &Apache::lonlocal::locallocaltime($accessstart,$timezone).'
  • '. - '
  • '.&mt('Access ends:').' '.&Apache::lonlocal::locallocaltime($accessend,$timezone).'
  • '. - '

'; - $r->print($output); - $output = ''; - $donedisplay = 1; - } else { - &roster_upload_form($r,$output,$formname); - $output = ''; - } - } else { - $output .= '

'; - &roster_upload_form($r,$output,$formname); - $output = ''; - } - } elsif ($env{'form.concepttest'} eq 'defchosen') { - $output .= '
'; - my $error = &Apache::londocsgci::store($caller,$dom,$cnum); - if ($error) { - $output .= ''. - &mt('An error occurred saving an auto-generated concept test: [_1].',$error). - ''; - } else { - &Apache::lonuserstate::readmap($dom.'/'.$cnum); - $output .= &mt('A concept test has also been generated.'); - } - $output .= '

'; - &roster_upload_form($r,$output,$formname); - $output = ''; - } else { - $output .= '


'.&mt('The next step is to chose which questions are to be included in the Concept Test.').'

'; - $r->print($output); - &Apache::londocsgci::editor($r,'requestcrs',$dom,$cnum); - $output = ''; - } - } else { - $output .= '
'.$role_result.'

'; - } + $output .= '
'.$role_result.'

'; $creationresult = 'created'; } else { $output = ''; @@ -3370,6 +3298,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'}); @@ -3404,26 +3335,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 .= ''.&mt('An error occurred saving a record of the details of your request: [_1].',$storeresult).'
'; - &Apache::lonnet::logthis("Error saving course request - $requestkey for $env{'user.name'}:$env{'user.domain'} - $storeresult"); - } elsif ($statusresult ne 'ok') { - $output .= ''.&mt('An error occurred saving a record of the status of your request: [_1].',$statusresult).'
'; - &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 .= '

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

'; @@ -3433,13 +3347,13 @@ sub print_request_outcome { $output .= ¬ification_information($disposition,$req_notifylist,$cnum,$now); } if ($validationerror ne '') { - $output .= ''.&mt('An error occurred validating your request with institutional data sources: [_1].',$validationerror).'

'; + $output .= '

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

'; + } + if ($updateresult) { + $output .= $updateresult; } } if ($creationresult ne '') { - if ($donedisplay) { - $r->print('
'.&done_display()); - } return ($creationresult,$output); } else { return ($storeresult,$output); @@ -3581,138 +3495,6 @@ sub update_requestors_roles { return $output; } -sub acquire_cc_role { - my ($cdom,$cnum,$trolecode,$csec) = @_; - my %coursegroups = &Apache::lonnet::get_active_groups( - $env{'user.domain'},$env{'user.name'},$cdom, $cnum); - my $cgrps = join(':',keys(%coursegroups)); - if ($env{'environment.recentroles'}) { - my %frozen_roles = - &Apache::lonhtmlcommon::get_recent_frozen('roles',$env{'environment.recentrolesn'}); - &Apache::lonhtmlcommon::store_recent('roles',$trolecode,' ', - $frozen_roles{$trolecode}); - } - - &Apache::lonnet::appenv({"request.course.id" => '', - "request.course.fn" => '', - "request.course.uri" => '', - "request.course.sec" => '', - "request.role" => 'cm', - "request.role.adv" => $env{'user.adv'}, - "request.role.domain" => $env{'user.domain'}}); - - &Apache::lonnet::log($env{'user.domain'}, - $env{'user.name'}, - $env{'user.home'}, - "Role ".$trolecode); - - &Apache::lonnet::appenv( - {'request.role' => $trolecode, - 'request.role.domain' => $cdom, - 'request.course.sec' => $csec, - 'request.course.groups' => $cgrps}); - my ($furl,$ferr) = &Apache::lonuserstate::readmap($cdom.'/'.$cnum); - my $tadv; - if (&Apache::lonnet::allowed('adv') eq 'F') { $tadv=1; } - &Apache::lonnet::appenv({'request.role.adv'=>$tadv}); - return; -} - -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', - 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 roster_upload_form { - my ($r,$output,$formname,$titletext) = @_; - my $title = &mt('Request Processed'); - if ($titletext ne '') { - $title = $titletext; - } - $r->print(<<"ENDJS"); - - -ENDJS - $r->print('

'.$title.'

'.$output. - '

'.&mt('Course roster file upload').'

'); - $r->print('

'.&mt('If you have a text file available containing student e-mail addresses and initial passwords, you may upload it now.').'
'. - &mt('You may also enroll students later with the [_1]"Enrollment/Activity"[_2] utility in the management toolbar.','','').'

'. - &mt('Upload roster file now?').' '. - '
'. - '
'. - ''. - '
'. - ''); -} - sub notification_information { my ($disposition,$req_notifylist,$cnum,$now) = @_; my %emails = &Apache::loncommon::getemails(); @@ -3744,100 +3526,12 @@ sub notification_information { ''; } else { $output .= '
'. - &mt('Your request status is: [_1].',$disposition). - '
' + &mt('Your request status is: [_1].',$disposition). + ''; } 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'}, @@ -4040,16 +3734,5 @@ sub generate_date_items { return; } -sub show_cloneable { - my $showclone; - if (&Apache::loncommon::needs_gci_custom()) { - my %courses = &Apache::loncommon::existing_gcitest_courses('cc'); - my $numcourses = scalar(keys(%courses)); - return $numcourses; - } else { - return 1; - } -} - 1; 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.