--- loncom/interface/lonrequestcourse.pm 2010/11/29 04:40:12 1.41.2.9 +++ loncom/interface/lonrequestcourse.pm 2011/01/05 18:47:46 1.60 @@ -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.60 2011/01/05 18:47:46 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; } @@ -720,11 +647,7 @@ sub onload_action { sub print_main_menu { my ($r,$can_request,$states,$dom,$jscript,$loaditems,$crumb,$request_domains) = @_; my ($types,$typename) = &Apache::loncommon::course_types(); - my $onchange; - unless ($env{'form.interface'} eq 'textual') { - $onchange = 'this.form.submit()'; - } - + my $onchange = 'this.form.submit()'; my $nextstate_setter = "\n"; if (ref($states) eq 'HASH') { foreach my $key (keys(%{$states})) { @@ -738,13 +661,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 +673,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 +685,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.\\n\"All types\" is not allowed.', + ); + $js .= <{'official'}) || ($can_request->{'unofficial'})) { @@ -829,41 +749,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 +783,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 +847,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 +909,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 +995,7 @@ END } $r->print('

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

'."\n".$form."\n". ''."\n". - ''."\n". + ''."\n". ''."\n". ''."\n"); if ($result eq 'ok') { @@ -1157,8 +1031,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 +1276,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; @@ -1450,16 +1322,38 @@ sub print_request_form { } if ($skipuser) { push(@disallowed,$i); - $disallowmsg{$i} = &mt('[_1] was excluded because new users need be from the course domain',''.$personname.':'.$persondom.''); + $disallowmsg{$i} = &mt('[_1] was excluded because new users need to be from the course domain',''.$personname.':'.$persondom.''); next; } } - if (&get_cancreate_status($persondom,$personname,$dom)) { - my ($allowed,$msg) = + my $usertype = &get_usertype($persondom,$personname,\%curr_rules,\%got_rules); + if (&Apache::lonuserutils::can_create_user($dom,'requestcrs',$usertype)) { + my ($allowed,$msg,$authtype,$authparam) = &check_newuser_rules($persondom,$personname, \%alerts,\%rulematch,\%inst_results, \%curr_rules,\%got_rules); if ($allowed) { + my %domdefaults = &Apache::lonnet::get_domain_defaults($persondom); + if ($usertype eq 'official') { + if ($authtype eq '') { + $authtype = $domdefaults{'auth_def'}; + $authparam = $domdefaults{'auth_arg_def'}; + } + } elsif ($usertype eq 'unofficial') { + if ($authtype eq '') { + $authtype = 'internal'; + $authparam = ''; + } + } else { + $authtype = $domdefaults{'auth_def'}; + $authparam = $domdefaults{'auth_arg_def'}; + } + if (($authtype eq '') || + (($authtype =~/^krb/) && ($authparam eq ''))) { + push(@disallowed,$i); + $disallowmsg{$i} = &mt('[_1] was excluded because institutional information is incomplete for this new user.',''.$personname.':'.$persondom.''); + next; + } if (ref($inst_results{$personname.':'.$persondom}) eq 'HASH') { if ($inst_results{$personname.':'.$persondom}{'lastname'} ne '') { $env{'form.person_'.$i.'_lastname'} = $inst_results{$personname.':'.$persondom}{'lastname'}; @@ -1505,7 +1399,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 +1419,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 +1433,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,46 +1470,19 @@ 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) = @_; +sub get_usertype { + my ($persondom,$personname,$curr_rules,$got_rules) = @_; my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($persondom,'username'); my $usertype = &Apache::lonuserutils::check_usertype($persondom,$personname, - $rules); - return &Apache::lonuserutils::can_create_user($dom,'requestcrs',$usertype); + $rules,$curr_rules,$got_rules); + return $usertype; } sub check_newuser_rules { @@ -1623,7 +1490,7 @@ sub check_newuser_rules { $got_rules) = @_; my $allowed = 1; my $newuser = 1; - my ($checkhash,$userchkmsg); + my ($checkhash,$userchkmsg,$authtype,$authparam); my $checks = { 'username' => 1 }; $checkhash->{$personname.':'.$persondom} = { 'newuser' => $newuser }; &Apache::loncommon::user_rule_check($checkhash,$checks,$alerts,$rulematch, @@ -1645,7 +1512,22 @@ sub check_newuser_rules { } } } - return ($allowed,$userchkmsg); + if ($allowed) { + if (ref($rulematch) eq 'HASH') { + if (ref($rulematch->{$personname.':'.$persondom}) eq 'HASH') { + my $matchedrule = $rulematch->{$personname.':'.$persondom}{'username'}; + my ($rules,$ruleorder) = + &Apache::lonnet::inst_userrules($persondom,'username'); + if (ref($rules) eq 'HASH') { + if (ref($rules->{$matchedrule}) eq 'HASH') { + $authtype = $rules->{$matchedrule}{'authtype'}; + $authparam = $rules->{$matchedrule}{'authparm'}; + } + } + } + } + } + return ($allowed,$userchkmsg,$authtype,$authparam); } sub get_excluded_elements { @@ -1673,25 +1555,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 +1601,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 +1612,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 +1648,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 +1714,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 +1744,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 +1866,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 +1894,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 +2129,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 +2160,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 +2567,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'}, - $env{'user.domain'},$env{'form.clonecrs'},$env{'form.clonedom'}, + $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($uname, + $udom,$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 +2722,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 +2734,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 +2774,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 +2793,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; } @@ -2761,15 +2820,16 @@ sub clone_form { 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'}).''.&Apache::lonhtmlcommon::row_closure(1). &Apache::lonhtmlcommon::row_title($lt{'dmn'}).''.&Apache::lonhtmlcommon::row_closure(1). + &Apache::loncommon::select_dom_form($dom,'clonedom').''. + &Apache::lonhtmlcommon::row_closure(1). + &Apache::lonhtmlcommon::row_title($lt{'cid'}).' '. + &Apache::loncommon::selectcourse_link($formname,'clonecrs','clonedom','','','',$type). + &Apache::lonhtmlcommon::row_closure(1). &Apache::lonhtmlcommon::row_title($lt{'dsh'}).'