--- loncom/interface/loncreatecourse.pm 2020/05/22 19:57:57 1.158.2.6 +++ loncom/interface/loncreatecourse.pm 2016/04/04 01:13:38 1.160 @@ -1,7 +1,7 @@ # The LearningOnline Network # Create a course # -# $Id: loncreatecourse.pm,v 1.158.2.6 2020/05/22 19:57:57 raeburn Exp $ +# $Id: loncreatecourse.pm,v 1.160 2016/04/04 01:13:38 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -82,11 +82,7 @@ use Apache::lonlocal; use Apache::lonuserutils; use Apache::lonclonecourse; use LONCAPA::batchcreatecourse; -use LONCAPA qw(:DEFAULT :match); - -my $registered_flush; -my $registered_instcats; -my $modified_dom; +use LONCAPA; # ===================================================== Phase one: fill-in form @@ -95,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); @@ -103,7 +101,7 @@ sub print_course_creation_page { foreach my $server (sort(keys(%host_servers))) { $course_home .= qq{$server $host_servers{$server}}; } @@ -120,8 +118,6 @@ 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'); - my $openallfrom = - &Apache::lonhtmlcommon::date_setter('ccrs','openallfrom',$starttime); if ($crstype eq 'Course') { $enroll_table = &Apache::lonuserutils::date_setting_table($starttime, $endtime,'create_enrolldates'); @@ -136,7 +132,7 @@ sub print_course_creation_page { $krbform = &Apache::loncommon::authform_kerberos(%param); $intform = &Apache::loncommon::authform_internal(%param); $locform = &Apache::loncommon::authform_local(%param); - } else { + } elsif ($crstype eq 'Community') { my $title_alert = &mt('A Community title is required'); my $coord_alert = &mt('The username of the Coordinator is required'); &js_escape(\$title_alert); @@ -153,6 +149,24 @@ function validate(formname) { formname.submit(); } |; + } else { + my $title_alert = &mt('A Placement Test title is required'); + my $coord_alert = &mt('The username of the Course Coordinator is required'); + &js_escape(\$title_alert); + &js_escape(\$coord_alert); + $javascript_validations = qq| +function validate(formname) { + if (formname.title == '') { + alert("$title_alert"); + return; + } + if (formname.ccuname == '') { + alert("$coord_alert"); + } + formname.submit(); +} + |; + } my %lt=&Apache::lonlocal::texthash( 'cinf' => "Course Information", @@ -191,11 +205,9 @@ function validate(formname) { 'shd' => 'Shift date parameters by number of days', 'assp' => "Assessment Parameters", 'oaas' => "Open all assessments", - 'sta' => "starting from:", 'mssg' => "Messaging", 'scpf' => "Set course policy feedback to Course Coordinator", - 'scfc' => "Set resource content feedback to Course Coordinator", - 'scof' => "Set course content feedback to Course Coordinator", + 'scfc' => "Set content feedback to Course Coordinator", 'cmmn' => "Communication", 'dsrd' => "Disable student resource discussion", 'dsuc' => "Disable student use of chat rooms", @@ -241,8 +253,7 @@ function validate(formname) { $lt{'navi'} = &mt('Community Contents'); $lt{'cid'} = &mt('Community ID'); $lt{'scpf'} = &mt('Set community policy feedback to Coordinator'); - $lt{'scfc'} = &mt('Set resource content feedback to Coordinator'); - $lt{'scof'} = &mt('Set community content feedback to Coordinator'); + $lt{'scfc'} = &mt('Set content feedback to Coordinator'); $lt{'dsrd'} = &mt('Disable member resource discussion'); $lt{'dsuc'} = &mt('Disable member use of chat rooms'); $lt{'dads'} = &mt('Default Access Dates for Members'); @@ -253,11 +264,21 @@ 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 = < -// $coursebrowserjs END @@ -285,6 +304,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); @@ -296,7 +316,7 @@ END 'Create_Courses'); $r->print($start_page.$crumbs); - $r->print('' + $r->print('' .&Apache::lonhtmlcommon::start_pick_box() .&Apache::lonhtmlcommon::row_headline() @@ -363,9 +383,12 @@ END .'' .''.&mt('Yes').(' 'x2) .''.&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() @@ -391,15 +414,14 @@ END .&Apache::lonhtmlcommon::row_closure() .&Apache::lonhtmlcommon::row_title($lt{'fres'}) .'' - .''.$lt{'blnk'} - .'' - .' '); + .''.$lt{'blnk'} + .''); if ($crstype eq 'Community') { - $r->print('' + $r->print(' ' .''.$lt{'navi'} .''); - } else { - $r->print('' + } elsif ($crstype eq 'Course') { + $r->print(' ' .''.$lt{'sllb'} .'' .' ' @@ -411,7 +433,7 @@ END .&Apache::lonhtmlcommon::row_closure(1) .&Apache::lonhtmlcommon::end_pick_box() - .' ' + .' ' # Clone Course: .'' @@ -461,10 +483,7 @@ END .&Apache::lonhtmlcommon::row_closure() .&Apache::lonhtmlcommon::row_title($lt{'oaas'}) - .'' - .''.$lt{'no'}.''.(' 'x2) - .''.$lt{'yes'}.''.', ' - .$lt{'sta'}.' '.$openallfrom.'' + .'' .&Apache::lonhtmlcommon::row_closure() .&Apache::lonhtmlcommon::row_headline() @@ -479,10 +498,6 @@ END .'' .&Apache::lonhtmlcommon::row_closure() - .&Apache::lonhtmlcommon::row_title($lt{'scof'}) - .'' - .&Apache::lonhtmlcommon::row_closure() - .&Apache::lonhtmlcommon::row_headline() .''.$lt{'cmmn'}.'' .&Apache::lonhtmlcommon::row_closure() @@ -578,8 +593,7 @@ END - -' +' ); } elsif ($crstype eq 'Community') { $r->print(' @@ -589,6 +603,14 @@ END ' ); + } elsif ($crstype eq 'Placement') { + $r->print(' + + + + +' + ); } $r->print(''. $end_page); @@ -601,7 +623,7 @@ sub create_course { my $ccuname =&LONCAPA::clean_username($env{'form.ccuname'}); my $ccdomain=&LONCAPA::clean_domain($env{'form.ccdomain'}); my $crstype = 'Community'; - my ($enrollstart,$enrollend,$startaccess,$endaccess,$openallfrom); + my ($enrollstart,$enrollend,$startaccess,$endaccess); my %domdefaults = &Apache::lonnet::get_domain_defaults($env{'request.role.domain'}); @@ -609,10 +631,11 @@ 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'); - $openallfrom = &Apache::lonhtmlcommon::get_date_from_form('openallfrom'); my $autharg; my $authtype; @@ -671,14 +694,12 @@ sub create_course { endaccess => $endaccess, setpolicy => $env{'form.setpolicy'}, setcontent => $env{'form.setcontent'}, - setcomment => $env{'form.setcomment'}, reshome => $env{'form.reshome'}, setkeys => $env{'form.setkeys'}, keyauth => $env{'form.keyauth'}, disresdis => $env{'form.disresdis'}, disablechat => $env{'form.disablechat'}, openall => $env{'form.openall'}, - openallfrom => $openallfrom, firstres => $env{'form.firstres'} }; @@ -749,10 +770,8 @@ sub create_course { ''.&mt('Course identifier to share with students: [_1]',$code).'' ); } - if ($env{'form.crscode'} ne '') { - &Apache::lonnet::devalidate_cache_new('instcats',$crsudom); - } - ®ister_cleanups($r,$crsudom,$env{'form.crscode'}); + # Flush the course logs so reverse user roles immediately updated + $r->register_cleanup(\&Apache::lonnet::flushcourselogs); $r->print(''.&mt('Roles will be active at next login').'.'); } $r->print(''. @@ -761,19 +780,15 @@ sub create_course { } sub print_intro_page { - my ($r,$show_all_choices,$cancreate,$permission) = @_; + my ($r,$show_all_choices,$cancreate) = @_; 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(); my $helplink=&Apache::loncommon::help_open_topic('Create_Course_Community',&mt('Help on Creating Courses and Communities')); # Create menu - my $approve = 'Display requests awaiting approval'; - if ($permission->{'create'}) { - $approve = 'Approve or reject requests'; - } my @menu; @menu = ({ categorytitle => 'Course/Community Creation', @@ -781,7 +796,7 @@ sub print_intro_page { { linktext => 'Create a single course', url => '/adm/createcourse?phase=courseone', - permission => $permission->{'create'}, + permission => 1, #help => '', icon => 'crsnew.png', linktitle => 'Create a new course by completing an online form.' @@ -789,30 +804,38 @@ sub print_intro_page { { linktext => 'Create a single community', url => '/adm/createcourse?phase=groupone', - permission => $permission->{'create'} && $cancreate->{'Community'}, + permission => $cancreate->{'Community'}, #help => '', icon => 'crsnew.png', 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 => $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'}, + permission => 1, 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.' }, ] }, { categorytitle => 'Course/Community Requests', items => [ { - linktext => $approve, + linktext => 'Approve or reject requests', url => '/adm/createcourse?phase=requestdisplay', 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', @@ -833,7 +856,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.' }, ] }, @@ -850,86 +873,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(''.&mt('Upload a courses or communities attributes file').''); + $r->print(''.&mt('Upload a courses, communities or placement tests attributes file').''); $r->print(''. ''. ''. ''); + 'value="'.&mt('Create Courses/Communities/Placement Tests').'" />'); $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 ($result,$logmsg,$keysmsg,$codesref,$instcodesref); - 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\E_\Q$udom\E)/pending/([^/]+)$}) { - my ($batchdir,$filename) = ($1,$2); - if (-e "$batchfilepath") { - if (open(FILE,"<",$batchfilepath)) { - my @buffer = ; + my $batchfilepath=&Apache::lonnet::userfileupload('coursecreatorxml',undef, + 'batchupload',undef,undef, + undef,undef,$defdom); + my ($batchdir,$filename) = ($batchfilepath =~ m-^(.+)/pending/([^/]+)$-); + my ($result,$logmsg); + if (-e "$batchfilepath") { + open(FILE,"<$batchfilepath"); + my @buffer = ; + 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,$keysmsg,$codesref,$instcodesref) = - &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"); - } - my $updatecats; - if ((ref($instcodesref) eq 'HASH') && (keys(%{$instcodesref}) > 0)) { - &Apache::lonnet::devalidate_cache_new('instcats',$defdom); - $updatecats = 1; - } - ®ister_cleanups($r,$defdom,$updatecats); - - } + if (-e "$batchdir/processed/$filename") { + unlink("$batchdir/pending/$filename"); } - } else { - $result = ''.&mt('Could not open attributes file.').''.&mt('No courses created.').''; } - } else { - $result = ''.&mt('No uploaded attributes file found.').''.&mt('No courses created.').''; } - } else { - $result = ''.&mt('Invalid path to attributes file.').''.&mt('No courses created.').''; } - } else { - $result = ''.&mt("Your username, domain, and/or your current role's domain are missing or contain invalid characters."). - ''.&mt('No courses created.').''; } - $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.''. - &mt('Creation options menu').''. - &Apache::loncommon::end_page()); + $r->print($start_page.$crumbs.$logmsg.$result.''. + &mt('Creation options menu').''.$end_page); + } sub courserequestbrowser_javascript { @@ -1013,6 +1011,8 @@ sub print_creation_logs { $crstype = '.'; } elsif ($curr{'type'} eq 'community') { $crstype = 'Community'; + } elsif ($curr{'type'} eq 'placement') { + $crstype = 'Placement'; } my ($instcodefilter,$regexpok); @@ -1103,6 +1103,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 '') { @@ -1303,58 +1305,6 @@ ENDJS } -sub get_permission { - my ($dom) = @_; - my ($allowed,%permission); - if (&Apache::lonnet::allowed('ccc',$dom)) { - $allowed = 1; - %permission = ( - create => 1, - ); - } elsif (&Apache::lonnet::allowed('dcc',$dom)) { - $allowed = 1; - } - return ($allowed,\%permission); -} - -sub register_cleanups { - my ($r,$cdom,$updatecats) = @_; - # Flush the course logs so reverse user roles immediately updated - unless ($registered_flush) { - my $handlers = $r->get_handlers('PerlCleanupHandler'); - $r->set_handlers('PerlCleanupHandler' => [\&Apache::lonnet::flushcourselogs,@{$handlers}]); - $registered_flush=1; - } - # Update cache of self-cataloging courses on institution's server(s). - if ($updatecats) { - if (&Apache::lonnet::shared_institution($cdom)) { - unless ($registered_instcats) { - my $handlers = $r->get_handlers('PerlCleanupHandler'); - $r->set_handlers('PerlCleanupHandler' => [\&devalidate_remote_instcats,@{$handlers}]); - $registered_instcats=1; - $modified_dom = $cdom; - } - } - } - return; -} - -sub devalidate_remote_instcats { - if ($modified_dom ne '') { - my %servers = &Apache::lonnet::internet_dom_servers($modified_dom); - my %thismachine; - map { $thismachine{$_} = 1; } &Apache::lonnet::current_machine_ids(); - if (keys(%servers)) { - foreach my $server (keys(%servers)) { - next if ($thismachine{$server}); - &Apache::lonnet::remote_devalidate_cache($server,['instcats:'.$modified_dom]); - } - } - $modified_dom = ''; - } - return; -} - # ===================================================================== Handler sub handler { my $r = shift; @@ -1365,31 +1315,28 @@ sub handler { return OK; } - $registered_flush = 0; - $registered_instcats = 0; - $modified_dom = ''; - - my ($allowed,$permission) = &get_permission($env{'request.role.domain'}); - if ($allowed) { - my $show_all_choices = 0; - my $primary_rev = &Apache::lonnet::get_server_loncaparev($env{'request.role.domain'}); - my %cancreate = ( - Community => 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) = - split(/\./,$Apache::lonnet::needsrelease{'course:crstype:'.$key}); - unless (($needsmajor > $primary_major) || - (($needsmajor == $primary_major) && ($needsminor > $primary_minor))) { - $cancreate{$key} = 1; - } + my $show_all_choices = 0; + 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) = + split(/\./,$Apache::lonnet::needsrelease{'course:crstype:'.$key}); + unless (($needsmajor > $primary_major) || + (($needsmajor == $primary_major) && ($needsminor > $primary_minor))) { + $cancreate{$key} = 1; } } + } + if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; @@ -1400,10 +1347,11 @@ sub handler { ({href=>"/adm/createcourse", text=>"Creation Options", faq=>79,bug=>'Dom Coord Interface',}); - if (($permission->{'create'}) && - (($env{'form.phase'} eq 'coursetwo') || - (($env{'form.phase'} eq 'grouptwo') && - ($cancreate{'Community'})))) { + if (($env{'form.phase'} eq 'coursetwo') || + (($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',), @@ -1413,24 +1361,23 @@ sub handler { text=>"Creation Outcome", faq=>9,bug=>'Dom Coord Interface',}); &create_course($r); - } elsif (($permission->{'create'}) && - (($env{'form.phase'} eq 'courseone') || - (($env{'form.phase'} eq 'groupone') && - ($cancreate{'Community'})))) { + } elsif (($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',), faq=>9,bug=>'Dom Coord Interface',}); &print_course_creation_page($r); - } elsif (($permission->{'create'}) && - ($env{'form.phase'} eq 'batchone')) { + } elsif ($env{'form.phase'} eq 'batchone') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/createcourse?phase=$env{'form.phase'}", text=>"Upload Description File", faq=>9,bug=>'Dom Coord Interface',}); &upload_batchfile($r); - } elsif (($permission->{'create'}) && - ($env{'form.phase'} eq 'batchtwo')) { + } elsif ($env{'form.phase'} eq 'batchtwo') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/createcourse?phase=$env{'form.prevphase'}", text=>"Upload Description File", @@ -1448,16 +1395,11 @@ sub handler { my $js = &courserequestbrowser_javascript(); my $start_page=&Apache::loncommon::start_page('Display Requests',$js); my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Display Requests','Course_Requests',undef,'Course_Requests'); - my $context = 'domain'; - unless ($permission->{'create'}) { - $context = 'helpdesk'; - } $r->print($start_page.$crumbs."\n".''. &Apache::loncoursequeueadmin::display_queued_requests( - $context,$env{'request.role.domain'}).''. + 'domain',$env{'request.role.domain'}).''. &Apache::loncommon::end_page()); - } elsif (($permission->{'create'}) && - ($env{'form.phase'} eq 'requestchange') && ($show_all_choices)) { + } elsif (($env{'form.phase'} eq 'requestchange') && ($show_all_choices)) { if ($env{'form.queue'} eq 'pending') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/createcourse?phase=pendingdisplay", @@ -1487,16 +1429,11 @@ sub handler { my $js = &courserequestbrowser_javascript(); my $start_page=&Apache::loncommon::start_page('Display Pending Queue',$js); my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Display Pending Queue','Course_Requests',undef,'Course_Requests'); - my $context = 'pending'; - unless ($permission->{'create'}) { - $context = 'displaypending'; - } $r->print($start_page.$crumbs."\n".''. &Apache::loncoursequeueadmin::display_queued_requests( - $context,$env{'request.role.domain'}).''. + 'pending',$env{'request.role.domain'}).''. &Apache::loncommon::end_page()); - } elsif (($permission->{'create'}) && - ($env{'form.phase'} eq 'requestvalidation') && ($show_all_choices)) { + } elsif (($env{'form.phase'} eq 'requestvalidation') && ($show_all_choices)) { my $js = &courserequestbrowser_javascript(); &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/createcourse?phase=pendingdisplay", @@ -1523,7 +1460,7 @@ sub handler { &print_creation_logs($r); $r->print(''.&Apache::loncommon::end_page()); } else { - &print_intro_page($r,$show_all_choices,\%cancreate,$permission); + &print_intro_page($r,$show_all_choices,\%cancreate); } } else { $env{'user.error.msg'}=
- -
+ + + +
'.&mt('Course identifier to share with students: [_1]',$code).'
'.&mt('Roles will be active at next login').'.
'. @@ -761,19 +780,15 @@ sub create_course { } sub print_intro_page { - my ($r,$show_all_choices,$cancreate,$permission) = @_; + my ($r,$show_all_choices,$cancreate) = @_; 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(); my $helplink=&Apache::loncommon::help_open_topic('Create_Course_Community',&mt('Help on Creating Courses and Communities')); # Create menu - my $approve = 'Display requests awaiting approval'; - if ($permission->{'create'}) { - $approve = 'Approve or reject requests'; - } my @menu; @menu = ({ categorytitle => 'Course/Community Creation', @@ -781,7 +796,7 @@ sub print_intro_page { { linktext => 'Create a single course', url => '/adm/createcourse?phase=courseone', - permission => $permission->{'create'}, + permission => 1, #help => '', icon => 'crsnew.png', linktitle => 'Create a new course by completing an online form.' @@ -789,30 +804,38 @@ sub print_intro_page { { linktext => 'Create a single community', url => '/adm/createcourse?phase=groupone', - permission => $permission->{'create'} && $cancreate->{'Community'}, + permission => $cancreate->{'Community'}, #help => '', icon => 'crsnew.png', 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 => $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'}, + permission => 1, 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.' }, ] }, { categorytitle => 'Course/Community Requests', items => [ { - linktext => $approve, + linktext => 'Approve or reject requests', url => '/adm/createcourse?phase=requestdisplay', 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', @@ -833,7 +856,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.' }, ] }, @@ -850,86 +873,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(''.&mt('Upload a courses or communities attributes file').''); + $r->print(''.&mt('Upload a courses, communities or placement tests attributes file').''); $r->print(''. ''. ''. ''); + 'value="'.&mt('Create Courses/Communities/Placement Tests').'" />'); $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 ($result,$logmsg,$keysmsg,$codesref,$instcodesref); - 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\E_\Q$udom\E)/pending/([^/]+)$}) { - my ($batchdir,$filename) = ($1,$2); - if (-e "$batchfilepath") { - if (open(FILE,"<",$batchfilepath)) { - my @buffer = ; + my $batchfilepath=&Apache::lonnet::userfileupload('coursecreatorxml',undef, + 'batchupload',undef,undef, + undef,undef,$defdom); + my ($batchdir,$filename) = ($batchfilepath =~ m-^(.+)/pending/([^/]+)$-); + my ($result,$logmsg); + if (-e "$batchfilepath") { + open(FILE,"<$batchfilepath"); + my @buffer = ; + 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,$keysmsg,$codesref,$instcodesref) = - &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"); - } - my $updatecats; - if ((ref($instcodesref) eq 'HASH') && (keys(%{$instcodesref}) > 0)) { - &Apache::lonnet::devalidate_cache_new('instcats',$defdom); - $updatecats = 1; - } - ®ister_cleanups($r,$defdom,$updatecats); - - } + if (-e "$batchdir/processed/$filename") { + unlink("$batchdir/pending/$filename"); } - } else { - $result = ''.&mt('Could not open attributes file.').''.&mt('No courses created.').''; } - } else { - $result = ''.&mt('No uploaded attributes file found.').''.&mt('No courses created.').''; } - } else { - $result = ''.&mt('Invalid path to attributes file.').''.&mt('No courses created.').''; } - } else { - $result = ''.&mt("Your username, domain, and/or your current role's domain are missing or contain invalid characters."). - ''.&mt('No courses created.').''; } - $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.''. - &mt('Creation options menu').''. - &Apache::loncommon::end_page()); + $r->print($start_page.$crumbs.$logmsg.$result.''. + &mt('Creation options menu').''.$end_page); + } sub courserequestbrowser_javascript { @@ -1013,6 +1011,8 @@ sub print_creation_logs { $crstype = '.'; } elsif ($curr{'type'} eq 'community') { $crstype = 'Community'; + } elsif ($curr{'type'} eq 'placement') { + $crstype = 'Placement'; } my ($instcodefilter,$regexpok); @@ -1103,6 +1103,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 '') { @@ -1303,58 +1305,6 @@ ENDJS } -sub get_permission { - my ($dom) = @_; - my ($allowed,%permission); - if (&Apache::lonnet::allowed('ccc',$dom)) { - $allowed = 1; - %permission = ( - create => 1, - ); - } elsif (&Apache::lonnet::allowed('dcc',$dom)) { - $allowed = 1; - } - return ($allowed,\%permission); -} - -sub register_cleanups { - my ($r,$cdom,$updatecats) = @_; - # Flush the course logs so reverse user roles immediately updated - unless ($registered_flush) { - my $handlers = $r->get_handlers('PerlCleanupHandler'); - $r->set_handlers('PerlCleanupHandler' => [\&Apache::lonnet::flushcourselogs,@{$handlers}]); - $registered_flush=1; - } - # Update cache of self-cataloging courses on institution's server(s). - if ($updatecats) { - if (&Apache::lonnet::shared_institution($cdom)) { - unless ($registered_instcats) { - my $handlers = $r->get_handlers('PerlCleanupHandler'); - $r->set_handlers('PerlCleanupHandler' => [\&devalidate_remote_instcats,@{$handlers}]); - $registered_instcats=1; - $modified_dom = $cdom; - } - } - } - return; -} - -sub devalidate_remote_instcats { - if ($modified_dom ne '') { - my %servers = &Apache::lonnet::internet_dom_servers($modified_dom); - my %thismachine; - map { $thismachine{$_} = 1; } &Apache::lonnet::current_machine_ids(); - if (keys(%servers)) { - foreach my $server (keys(%servers)) { - next if ($thismachine{$server}); - &Apache::lonnet::remote_devalidate_cache($server,['instcats:'.$modified_dom]); - } - } - $modified_dom = ''; - } - return; -} - # ===================================================================== Handler sub handler { my $r = shift; @@ -1365,31 +1315,28 @@ sub handler { return OK; } - $registered_flush = 0; - $registered_instcats = 0; - $modified_dom = ''; - - my ($allowed,$permission) = &get_permission($env{'request.role.domain'}); - if ($allowed) { - my $show_all_choices = 0; - my $primary_rev = &Apache::lonnet::get_server_loncaparev($env{'request.role.domain'}); - my %cancreate = ( - Community => 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) = - split(/\./,$Apache::lonnet::needsrelease{'course:crstype:'.$key}); - unless (($needsmajor > $primary_major) || - (($needsmajor == $primary_major) && ($needsminor > $primary_minor))) { - $cancreate{$key} = 1; - } + my $show_all_choices = 0; + 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) = + split(/\./,$Apache::lonnet::needsrelease{'course:crstype:'.$key}); + unless (($needsmajor > $primary_major) || + (($needsmajor == $primary_major) && ($needsminor > $primary_minor))) { + $cancreate{$key} = 1; } } + } + if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; @@ -1400,10 +1347,11 @@ sub handler { ({href=>"/adm/createcourse", text=>"Creation Options", faq=>79,bug=>'Dom Coord Interface',}); - if (($permission->{'create'}) && - (($env{'form.phase'} eq 'coursetwo') || - (($env{'form.phase'} eq 'grouptwo') && - ($cancreate{'Community'})))) { + if (($env{'form.phase'} eq 'coursetwo') || + (($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',), @@ -1413,24 +1361,23 @@ sub handler { text=>"Creation Outcome", faq=>9,bug=>'Dom Coord Interface',}); &create_course($r); - } elsif (($permission->{'create'}) && - (($env{'form.phase'} eq 'courseone') || - (($env{'form.phase'} eq 'groupone') && - ($cancreate{'Community'})))) { + } elsif (($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',), faq=>9,bug=>'Dom Coord Interface',}); &print_course_creation_page($r); - } elsif (($permission->{'create'}) && - ($env{'form.phase'} eq 'batchone')) { + } elsif ($env{'form.phase'} eq 'batchone') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/createcourse?phase=$env{'form.phase'}", text=>"Upload Description File", faq=>9,bug=>'Dom Coord Interface',}); &upload_batchfile($r); - } elsif (($permission->{'create'}) && - ($env{'form.phase'} eq 'batchtwo')) { + } elsif ($env{'form.phase'} eq 'batchtwo') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/createcourse?phase=$env{'form.prevphase'}", text=>"Upload Description File", @@ -1448,16 +1395,11 @@ sub handler { my $js = &courserequestbrowser_javascript(); my $start_page=&Apache::loncommon::start_page('Display Requests',$js); my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Display Requests','Course_Requests',undef,'Course_Requests'); - my $context = 'domain'; - unless ($permission->{'create'}) { - $context = 'helpdesk'; - } $r->print($start_page.$crumbs."\n".''. &Apache::loncoursequeueadmin::display_queued_requests( - $context,$env{'request.role.domain'}).''. + 'domain',$env{'request.role.domain'}).''. &Apache::loncommon::end_page()); - } elsif (($permission->{'create'}) && - ($env{'form.phase'} eq 'requestchange') && ($show_all_choices)) { + } elsif (($env{'form.phase'} eq 'requestchange') && ($show_all_choices)) { if ($env{'form.queue'} eq 'pending') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/createcourse?phase=pendingdisplay", @@ -1487,16 +1429,11 @@ sub handler { my $js = &courserequestbrowser_javascript(); my $start_page=&Apache::loncommon::start_page('Display Pending Queue',$js); my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Display Pending Queue','Course_Requests',undef,'Course_Requests'); - my $context = 'pending'; - unless ($permission->{'create'}) { - $context = 'displaypending'; - } $r->print($start_page.$crumbs."\n".''. &Apache::loncoursequeueadmin::display_queued_requests( - $context,$env{'request.role.domain'}).''. + 'pending',$env{'request.role.domain'}).''. &Apache::loncommon::end_page()); - } elsif (($permission->{'create'}) && - ($env{'form.phase'} eq 'requestvalidation') && ($show_all_choices)) { + } elsif (($env{'form.phase'} eq 'requestvalidation') && ($show_all_choices)) { my $js = &courserequestbrowser_javascript(); &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/createcourse?phase=pendingdisplay", @@ -1523,7 +1460,7 @@ sub handler { &print_creation_logs($r); $r->print(''.&Apache::loncommon::end_page()); } else { - &print_intro_page($r,$show_all_choices,\%cancreate,$permission); + &print_intro_page($r,$show_all_choices,\%cancreate); } } else { $env{'user.error.msg'}=
'.&mt('Could not open attributes file.').''.&mt('No courses created.').'
'.&mt('No uploaded attributes file found.').''.&mt('No courses created.').'
'.&mt('Invalid path to attributes file.').''.&mt('No courses created.').'
'.&mt("Your username, domain, and/or your current role's domain are missing or contain invalid characters."). - ''.&mt('No courses created.').'