--- loncom/interface/loncreatecourse.pm 2017/11/16 16:22:58 1.158.2.3.2.1 +++ loncom/interface/loncreatecourse.pm 2016/10/06 16:20:05 1.164 @@ -1,7 +1,7 @@ # The LearningOnline Network # Create a course # -# $Id: loncreatecourse.pm,v 1.158.2.3.2.1 2017/11/16 16:22:58 raeburn Exp $ +# $Id: loncreatecourse.pm,v 1.164 2016/10/06 16:20:05 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -91,6 +91,8 @@ sub print_course_creation_page { my $crstype = 'Community'; if ($env{'form.phase'} eq 'courseone') { $crstype = 'Course'; + } elsif ($env{'form.phase'} eq 'placementone') { + $crstype = 'Placement'; } my $defdom=$env{'request.role.domain'}; my %domdefaults = &Apache::lonnet::get_domain_defaults($defdom); @@ -116,7 +118,7 @@ sub print_course_creation_page { my $endtime = time+(6*30*24*60*60); # 6 months from now, approx my $access_table = &Apache::lonuserutils::date_setting_table($starttime, $endtime,'create_defaultdates'); - if ($crstype eq 'Course') { + if (($crstype eq 'Course') || ($crstype eq 'Placement')) { $enroll_table = &Apache::lonuserutils::date_setting_table($starttime, $endtime,'create_enrolldates'); ($krbdef,$krbdefdom) = @@ -215,6 +217,7 @@ function validate(formname) { 'cgrq' => 'Set a quota for the total disk space available for storage of course group portfolio files', 'opco' => 'Open Course', 'opcm' => 'Open Community', + 'oppt' => 'Open Placement Test', ); $lt{'kaut'} = &mt('Key authority ([_1]id:domain[_2]) if other than course','<tt>','</tt>'); $lt{'toin'} = &mt('to interface with institutional data, e.g., [_1]fs13glg231[_2] for [_3]Fall 2013 Geology 231[_4]','<tt>','</tt>','<i>','</i>'); @@ -246,6 +249,18 @@ function validate(formname) { $lt{'cc'} = &mt('(will be assigned Coordinator role)'); $lt{'cgrs'} = &mt('Community Group Settings'); $lt{'cgrq'} = &mt('Set a quota for the total disk space available for storage of community group portfolio files'); + } elsif ($crstype eq 'Placement') { + $lt{'cinf'} = &mt('Placement Test Information'); + $lt{'ctit'} = &mt('Placement Test Title'); + $lt{'chsr'} = &mt('Placement Test Home Server'); + $lt{'cidn'} = &mt('Placement Test ID/Number'); + $lt{'crco'} = &mt('Placement Test Content'); + $lt{'cncr'} = &mt('Completely new placement test'); + $lt{'cecr'} = &mt('Clone an existing placement test'); + $lt{'sacr'} = &mt('Do NOT generate as standard placement test'); + $lt{'stco'} = &mt('standard placement tests only'); + $lt{'navi'} = &mt('Placement Test Contents'); + $lt{'cid'} = &mt('Placement Test ID'); } my $js = <<END; <script type="text/javascript"> @@ -274,6 +289,7 @@ END my %titles = &Apache::lonlocal::texthash( courseone => 'Create a New Course', groupone => 'Create a New Community', + placementone=> 'Create a New Placement Test', ); my $start_page = &Apache::loncommon::start_page($titles{$env{'form.phase'}},$js); @@ -318,14 +334,16 @@ END .'<input type="text" size="30" name="crsid" />' .&Apache::lonhtmlcommon::row_closure() ); - if ($crstype eq 'Course') { + if (($crstype eq 'Course') || ($crstype eq 'Placement')) { $r->print(&Apache::lonhtmlcommon::row_headline() .'<h3>'.$lt{'iinf'}.'</h3>' - .$lt{'stat'}.' ' - .&mt('Default credits can also be specified, if different from the domain defaults (official courses: [_1]; unofficial courses: [_2]; textbook courses: [_3]).', - $domdefaults{'officialcredits'},$domdefaults{'unofficialcredits'},$domdefaults{'textbookcredits'}) - .&Apache::lonhtmlcommon::row_closure() - + .$lt{'stat'}); + if ($crstype eq 'Course') { + $r->print(' ' + .&mt('Default credits can also be specified, if different from the domain defaults (official courses: [_1]; unofficial courses: [_2]; textbook courses: [_3]).', + $domdefaults{'officialcredits'},$domdefaults{'unofficialcredits'},$domdefaults{'textbookcredits'})); + } + $r->print(&Apache::lonhtmlcommon::row_closure() .&Apache::lonhtmlcommon::row_title($lt{'ccod'}) .'<input type="text" size="30" name="crscode" />' .'<br />('.$lt{'toin'}.')' @@ -341,7 +359,8 @@ END .'<br />('.$lt{'cscs'}.')' .&Apache::lonhtmlcommon::row_closure() ); - if ($domdefaults{'officialcredits'} || $domdefaults{'unofficialcredits'} || $domdefaults{'textbookcredits'}) { + if (($crstype eq 'Course') && ($domdefaults{'officialcredits'} || + $domdefaults{'unofficialcredits'} || $domdefaults{'textbookcredits'})) { $r->print(&Apache::lonhtmlcommon::row_title($lt{'ccre'}) .'<input type="text" size="3" name="defaultcredits" />' .'<br />('.$lt{'cred'}.')' @@ -353,7 +372,11 @@ END .'<input type="radio" name="uniquecode" value="1" />'.&mt('Yes').(' 'x2) .'<input type="radio" name="uniquecode" value="0" checked="checked" />'.&mt('No') .&Apache::lonhtmlcommon::row_closure() - ); + ); + } + my $blankchk; + if ($crstype eq 'Placement') { + $blankchk = ' checked="checked"'; } # Table: New Course / Clone Course $r->print(&Apache::lonhtmlcommon::row_headline() @@ -379,15 +402,14 @@ END .&Apache::lonhtmlcommon::row_closure() .&Apache::lonhtmlcommon::row_title($lt{'fres'}) .'<label>' - .'<input type="radio" name="firstres" value="blank" />'.$lt{'blnk'} - .'</label>' - .' '); + .'<input type="radio" name="firstres" value="blank"'.$blankchk.' />'.$lt{'blnk'} + .'</label>'); if ($crstype eq 'Community') { - $r->print('<label>' + $r->print(' <label>' .'<input type="radio" name="firstres" value="nav" checked="checked" />'.$lt{'navi'} .'</label>'); - } else { - $r->print('<label>' + } elsif ($crstype eq 'Course') { + $r->print(' <label>' .'<input type="radio" name="firstres" value="syl" checked="checked" />'.$lt{'sllb'} .'</label>' .' ' @@ -500,7 +522,7 @@ END .'<input type="text" name="reshome" size="30" value="/res/'.$defdom.'/" />' .&Apache::lonhtmlcommon::row_closure() ); - if ($crstype eq 'Course') { + unless ($crstype eq 'Community') { $r->print(&Apache::lonhtmlcommon::row_headline() .'<h3>'.$lt{'aens'}.'</h3>' .&Apache::lonhtmlcommon::row_closure() @@ -573,6 +595,14 @@ END <input type="submit" value="'.$lt{'opcm'}.'" /> </p>' ); + } elsif ($crstype eq 'Placement') { + $r->print(' +<p> +<input type="hidden" name="prevphase" value="placementone" /> +<input type="hidden" name="phase" value="placementtwo" /> +<input type="button" onclick="verify_message(this.form)" value="'.$lt{'oppt'}.'" /> +</p>' + ); } $r->print('</form>'. $end_page); @@ -593,6 +623,8 @@ sub create_course { $crstype='Course'; $enrollstart=&Apache::lonhtmlcommon::get_date_from_form('startenroll'); $enrollend=&Apache::lonhtmlcommon::get_date_from_form('endenroll'); + } elsif ($env{'form.phase'} eq 'placementtwo') { + $crstype='Placement'; } $startaccess = &Apache::lonhtmlcommon::get_date_from_form('startaccess'); $endaccess = &Apache::lonhtmlcommon::get_date_from_form('endaccess'); @@ -743,7 +775,7 @@ sub create_course { sub print_intro_page { my ($r,$show_all_choices,$cancreate,$permission) = @_; my $start_page = - &Apache::loncommon::start_page('Create a New Course or Community'); + &Apache::loncommon::start_page('Create a New Course, Community or Placement Test'); my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Creation Options','Create_Course',undef,'Create_Courses'); my $end_page = &Apache::loncommon::end_page(); @@ -775,12 +807,20 @@ sub print_intro_page { linktitle => 'Create a new collaborative community by completing an online form.' }, { - linktext => 'Create courses/communities by uploading an attributes file', + linktext => 'Create a single placement test', + url => '/adm/createcourse?phase=placementone', + permission => $permission->{'create'} && $cancreate->{'Placement'}, + #help => '', + icon => 'crsnew.png', + linktitle => 'Create a new placement test by completing an online form.' + }, + { + linktext => 'Create courses/communities/placement tests by uploading an attributes file', url => '/adm/createcourse?phase=batchone', permission => $permission->{'create'}, help => 'Batch_Creation', icon => 'uplcrs.png', - linktitle => 'Upload an attributes file containing specifications for one or more courses or communities in XML format.' + linktitle => 'Upload an attributes file containing specifications for one or more courses, communities or placement tests in XML format.' }, ] }, @@ -792,7 +832,7 @@ sub print_intro_page { permission => $show_all_choices, #help => '', icon => 'rcrs.png', - linktitle => 'Display course and community creation requests submitted by authorized users, held pending approval by a Domain Coordinator.' + linktitle => 'Display course, community creation and placement test requests submitted by authorized users, held pending approval by a Domain Coordinator.' }, { linktext => 'View pending official course requests', @@ -813,7 +853,7 @@ sub print_intro_page { permission => $show_all_choices, #help => '', icon => 'document-properties.png', - linktitle => 'Display information about when, how and by whom courses and communities were created in this domain.' + linktitle => 'Display information about when, how and by whom courses, communities and placement tests were created in this domain.' }, ] }, @@ -830,78 +870,61 @@ sub print_intro_page { sub upload_batchfile { my $r = shift; my $start_page = - &Apache::loncommon::start_page('Create a New Course or Community'); - my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Upload Course/Community Attributes File','Create_Course',undef,'Create_Courses'); + &Apache::loncommon::start_page('Create a New Course, Community, or Placement Test'); + my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Upload Course/Community/Placement Test Attributes File','Create_Course',undef,'Create_Courses'); my $end_page = &Apache::loncommon::end_page(); $r->print($start_page.$crumbs); - $r->print('<h3>'.&mt('Upload a courses or communities attributes file').'</h3>'); + $r->print('<h3>'.&mt('Upload a courses, communities or placement tests attributes file').'</h3>'); $r->print('<form name="batchcreate" method="post" '. 'enctype="multipart/form-data" action="/adm/createcourse">'. '<input type="file" name="coursecreatorxml" />'. '<input type="hidden" name="phase" value="batchtwo" /><br /><br />'. '<input type="submit" name="batchsubmit" '. - 'value="'.&mt('Create Courses/Communities').'" /></form>'); + 'value="'.&mt('Create Courses/Communities/Placement Tests').'" /></form>'); $r->print($end_page); return; } sub process_batchfile { my $r = shift; + my $start_page = + &Apache::loncommon::start_page('Create a New Course, Community or Placement Test'); + my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Creation Outcome','Create_Course',undef,'Create_Courses'); + my $end_page = + &Apache::loncommon::end_page(); my $defdom=$env{'request.role.domain'}; - my $uname = $env{'user.name'}; - my $udom = $env{'user.domain'}; - my $dir = &LONCAPA::tempdir().'addcourse'; + my $batchfilepath=&Apache::lonnet::userfileupload('coursecreatorxml',undef, + 'batchupload',undef,undef, + undef,undef,$defdom); + my ($batchdir,$filename) = ($batchfilepath =~ m-^(.+)/pending/([^/]+)$-); my ($result,$logmsg); - if (($defdom =~ /^$match_domain$/) && ($uname =~ /^$match_username$/) && ($udom =~/^$match_domain$/)) { - my $batchfilepath=&Apache::lonnet::userfileupload('coursecreatorxml',undef, - 'batchupload',undef,undef, - undef,undef,$defdom); - if ($batchfilepath =~ m{^(\Q$dir/$defdom/web/$uname\_$udom\E)/pending/([^/]+)$}) { - my ($batchdir,$filename) = ($1,$2); - if (-e "$batchfilepath") { - if (open(FILE,"<",$batchfilepath)) { - my @buffer = <FILE>; + if (-e "$batchfilepath") { + open(FILE,"<$batchfilepath"); + my @buffer = <FILE>; + close(FILE); + if ((defined($filename)) && (defined($batchdir))) { + my @requests = ($filename); + my %courseids = (); + ($result,$logmsg) = &LONCAPA::batchcreatecourse::create_courses( + \@requests,\%courseids,'web',$defdom, + $env{'user.name'},$env{'user.domain'}); + if ($result) { + if (!-e "$batchdir/processed") { + mkdir("$batchdir/processed", 0755); + open(FILE,">$batchdir/processed/$filename"); + print FILE @buffer; close(FILE); - if ((defined($filename)) && (defined($batchdir))) { - my @requests = ($filename); - my %courseids = (); - ($result,$logmsg) = &LONCAPA::batchcreatecourse::create_courses( - \@requests,\%courseids,'web',$defdom, - $uname,$udom); - if (keys(%courseids) > 0) { - if (!-e "$batchdir/processed") { - mkdir("$batchdir/processed", 0755); - } - if (-d "$batchdir/processed") { - if (open(FILE,">","$batchdir/processed/$filename")) { - print FILE @buffer; - close(FILE); - } - } - if (-e "$batchdir/processed/$filename") { - unlink("$batchdir/pending/$filename"); - } - } + if (-e "$batchdir/processed/$filename") { + unlink("$batchdir/pending/$filename"); } - } else { - $result = '<p class="LC_error">'.&mt('Could not open attributes file.').'<br />'.&mt('No courses created.').'</p>'; } - } else { - $result = '<p class="LC_error">'.&mt('No uploaded attributes file found.').'<br />'.&mt('No courses created.').'</p>'; } - } else { - $result = '<p class="LC_error">'.&mt('Invalid path to attributes file.').'<br />'.&mt('No courses created.').'</p>'; } - } else { - $result = '<p class="LC_error">'.&mt("Your username, domain, and/or your current role's domain are missing or contain invalid characters."). - '<br />'.&mt('No courses created.').'</p>'; } - $r->print(&Apache::loncommon::start_page('Create a New Course, Community or Placement Test'). - &Apache::lonhtmlcommon::breadcrumbs('Creation Outcome','Create_Course',undef,'Create_Courses'). - $logmsg.$result.'<br /><a href="/adm/createcourse">'. - &mt('Creation options menu').'</a>'. - &Apache::loncommon::end_page()); + $r->print($start_page.$crumbs.$logmsg.$result.'<br /><a href="/adm/createcourse">'. + &mt('Creation options menu').'</a>'.$end_page); + } sub courserequestbrowser_javascript { @@ -985,6 +1008,8 @@ sub print_creation_logs { $crstype = '.'; } elsif ($curr{'type'} eq 'community') { $crstype = 'Community'; + } elsif ($curr{'type'} eq 'placement') { + $crstype = 'Placement'; } my ($instcodefilter,$regexpok); @@ -1075,6 +1100,8 @@ sub print_creation_logs { my $showtype; if ($courses{$cid}{type} eq 'Community') { $showtype = &mt('community'); + } elsif ($courses{$cid}{type} eq 'Placement') { + $showtype = &mt('placement test'); } else { my $instcode = $courses{$cid}{inst_code}; if ($instcode ne '') { @@ -1305,13 +1332,14 @@ sub handler { my $primary_rev = &Apache::lonnet::get_server_loncaparev($env{'request.role.domain'}); my %cancreate = ( Community => 0, + Placement => 0, ); if (($primary_rev ne 'refused') && ($primary_rev ne 'error') && ($primary_rev ne 'unknown_cmd') && ($primary_rev ne 'no_such_host')) { $show_all_choices = 1; my ($primary_major,$primary_minor) = split(/\./,$primary_rev); foreach my $key (keys(%cancreate)) { - my ($needsmajor,$needsminor) = + my ($needsmajor,$needsminor) = split(/\./,$Apache::lonnet::needsrelease{'course:crstype:'.$key}); unless (($needsmajor > $primary_major) || (($needsmajor == $primary_major) && ($needsminor > $primary_minor))) { @@ -1332,8 +1360,10 @@ sub handler { faq=>79,bug=>'Dom Coord Interface',}); if (($permission->{'create'}) && (($env{'form.phase'} eq 'coursetwo') || - (($env{'form.phase'} eq 'grouptwo') && - ($cancreate{'Community'})))) { + (($env{'form.phase'} eq 'grouptwo') && + ($cancreate{'Community'})) || + (($env{'form.phase'} eq 'placementtwo') && + ($cancreate{'Placement'})))) { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/createcourse?phase=$env{'form.prevphase'}", text=>&mt('[_1] Creation Settings',), @@ -1344,9 +1374,11 @@ sub handler { faq=>9,bug=>'Dom Coord Interface',}); &create_course($r); } elsif (($permission->{'create'}) && - (($env{'form.phase'} eq 'courseone') || - (($env{'form.phase'} eq 'groupone') && - ($cancreate{'Community'})))) { + (($env{'form.phase'} eq 'courseone') || + (($env{'form.phase'} eq 'groupone') && + ($cancreate{'Community'})) || + (($env{'form.phase'} eq 'placementone') && + ($cancreate{'Placement'})))) { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/createcourse?phase=$env{'form.phase'}", text=>&mt('[_1] Creation Settings',), @@ -1384,10 +1416,10 @@ sub handler { } $r->print($start_page.$crumbs."\n".'<div>'. &Apache::loncoursequeueadmin::display_queued_requests( - $context,$env{'request.role.domain'}).'</div>'. + $context,$env{'request.role.domain'},undef,).'</div>'. &Apache::loncommon::end_page()); } elsif (($permission->{'create'}) && - ($env{'form.phase'} eq 'requestchange') && ($show_all_choices)) { + ($env{'form.phase'} eq 'requestchange') && ($show_all_choices)) { if ($env{'form.queue'} eq 'pending') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/createcourse?phase=pendingdisplay", @@ -1426,7 +1458,7 @@ sub handler { $context,$env{'request.role.domain'}).'</div>'. &Apache::loncommon::end_page()); } elsif (($permission->{'create'}) && - ($env{'form.phase'} eq 'requestvalidation') && ($show_all_choices)) { + ($env{'form.phase'} eq 'requestvalidation') && ($show_all_choices)) { my $js = &courserequestbrowser_javascript(); &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/createcourse?phase=pendingdisplay",