--- loncom/interface/loncreatecourse.pm 2003/09/02 18:00:14 1.31 +++ loncom/interface/loncreatecourse.pm 2009/02/16 16:21:01 1.116 @@ -1,7 +1,7 @@ # The LearningOnline Network # Create a course # -# $Id: loncreatecourse.pm,v 1.31 2003/09/02 18:00:14 www Exp $ +# $Id: loncreatecourse.pm,v 1.116 2009/02/16 16:21:01 bisitz Exp $ # # Copyright Michigan State University Board of Trustees # @@ -25,135 +25,63 @@ # # http://www.lon-capa.org/ # -# (My Desk -# -# (Internal Server Error Handler -# -# (Login Screen -# 5/21/99,5/22,5/25,5/26,5/31,6/2,6/10,7/12,7/14, -# 1/14/00,5/29,5/30,6/1,6/29,7/1,11/9 Gerd Kortemeyer) -# -# 3/1/1 Gerd Kortemeyer) -# -# 3/1 Gerd Kortemeyer) -# -# 2/14,2/16,2/17,7/6 Gerd Kortemeyer -# -package Apache::loncreatecourse; +### -use strict; -use Apache::Constants qw(:common :http); -use Apache::lonnet; -use Apache::loncommon; -use Apache::lonratedt; -use Apache::londocs; +=head1 NAME -# -------------------------------------------- Return path to profile directory +Apache::loncreatecourse.pm -sub propath { - my ($udom,$uname)=@_; - $udom=~s/\W//g; - $uname=~s/\W//g; - my $subdir=$uname.'__'; - $subdir =~ s/(.)(.)(.).*/$1\/$2\/$3/; - my $proname="$Apache::lonnet::perlvar{'lonUsersDir'}/$udom/$subdir/$uname"; - return $proname; -} - -# ================================================ Get course directory listing - -sub crsdirlist { - my ($courseid,$which)=@_; - unless ($which) { $which=''; } - my %crsdata=&Apache::lonnet::coursedescription($courseid); - my @listing=&Apache::lonnet::dirlist - ($which,$crsdata{'domain'},$crsdata{'num'}, - &propath($crsdata{'domain'},$crsdata{'num'})); - my @output=(); - foreach (@listing) { - unless ($_=~/^\./) { - push (@output,(split(/\&/,$_))[0]); - } - } - return @output; -} +=head1 SYNOPSIS -# ============================================================= Read a userfile +Allows domain coordinators to create new +courses and assign course coordinators. -sub readfile { - my ($courseid,$which)=@_; - my %crsdata=&Apache::lonnet::coursedescription($courseid); - return &Apache::lonnet::getfile('/uploaded/'.$crsdata{'domain'}.'/'. - $crsdata{'num'}.'/'.$which); -} +This is part of the LearningOnline Network with CAPA project +described at http://www.lon-capa.org. -# ============================================================ Write a userfile +=head1 SUBROUTINES -sub writefile { - (my $courseid, my $which,$ENV{'form.output'})=@_; - my %crsdata=&Apache::lonnet::coursedescription($courseid); - return &Apache::lonnet::finishuserfileupload( - $crsdata{'num'},$crsdata{'domain'}, - $crsdata{'home'}, - 'output',$which); -} +=over -# ============================================================= Copy a userfile +=item handler() -sub copyfile { - my ($origcrsid,$newcrsid,$which)=@_; - return &writefile($newcrsid,$which,&readfile($origcrsid,$which)); -} +=item print_course_creation_page() -# =============================================================== Copy a dbfile +=item create_course() -sub copydb { - my ($origcrsid,$newcrsid,$which)=@_; - $which=~s/\.db$//; - my %origcrsdata=&Apache::lonnet::coursedescription($origcrsid); - my %newcrsdata= &Apache::lonnet::coursedescription($newcrsid); - my %data=&Apache::lonnet::dump - ($which,$origcrsdata{'domain'},$origcrsdata{'num'}); - return &Apache::lonnet::put - ($which,\%data,$newcrsdata{'domain'},$newcrsdata{'num'}); -} +=item print_intro_page() -# ========================================================== Copy all userfiles +=item upload_batchfile() -sub copyuserfiles { - my ($origcrsid,$newcrsid)=@_; - foreach (&crsdirlist($origcrsid,'userfiles')) { - ©file($origcrsid,$newcrsid,$_); - } -} -# ========================================================== Copy all userfiles +=item process_batchfile() -sub copydbfiles { - my ($origcrsid,$newcrsid)=@_; - foreach (&crsdirlist($origcrsid)) { - if ($_=~/\.db$/) { - unless - ($_=~/^(nohist\_|discussiontimes|classlist|versionupdate)/) { - ©db($origcrsid,$newcrsid,$_); - } - } - } -} +=back -# ======================================================= Copy all course files +=cut -sub copycoursefiles { - my ($origcrsid,$newcrsid)=@_; - ©userfiles($origcrsid,$newcrsid); - ©dbfiles($origcrsid,$newcrsid); -} +package Apache::loncreatecourse; + +use strict; +use Apache::Constants qw(:common :http); +use Apache::lonnet; +use Apache::loncommon; +use Apache::londocs; +use Apache::lonlocal; +use Apache::lonuserutils; +use Apache::lonclonecourse; +use LONCAPA::batchcreatecourse; +use LONCAPA; # ===================================================== Phase one: fill-in form sub print_course_creation_page { my $r=shift; - my $defdom=$ENV{'request.role.domain'}; - my %host_servers = &Apache::loncommon::get_library_servers($defdom); + my $crstype = 'Group'; + if ($env{'form.phase'} eq 'courseone') { + $crstype = 'Course'; + } + my $defdom=$env{'request.role.domain'}; + my %host_servers = &Apache::lonnet::get_servers($defdom,'library'); my $course_home = '' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'chsr'}) + .$course_home + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'cidn'}.' ('.$lt{'opt'}.')') + .'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_headline() + .'

'.$lt{'iinf'}.'

' + .$lt{'stat'} + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'ccod'}) + .'' + .'
('.$lt{'toin'}.')' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'snid'}) + .'' + .'
('.$lt{'csli'}.')' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'crcs'}) + .'' + .'
('.$lt{'cscs'}.')' + .&Apache::lonhtmlcommon::row_closure() + ); + + # Table: New Course / Clone Course + $r->print(&Apache::lonhtmlcommon::row_headline() + .'

'.$lt{'crco'}.'

' + .&Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row() + .''.$lt{'cncr'}.'' + .' '.&mt('or').' ' + .''.$lt{'cecr'}.'' + .&Apache::loncommon::end_data_table_header_row() + .&Apache::loncommon::start_data_table_row() + + # New Course: + .'' + .&Apache::lonhtmlcommon::start_pick_box() + .&Apache::lonhtmlcommon::row_title($lt{'map'}) + .'' + .''.$lt{'smap'}.'' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title('') + .'' + .'
('.$lt{'ocik'}.')' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title($lt{'fres'}) + .'' + .' ' + .'' + .' ' + .'' + .'
('.$lt{'stco'}.')' + .&Apache::lonhtmlcommon::row_closure(1) + .&Apache::lonhtmlcommon::end_pick_box() + + .' ' + + # Clone Course: + .'' + .&Apache::lonhtmlcommon::start_pick_box() + .&Apache::lonhtmlcommon::row_title($lt{'cid'}) + .'' + .&Apache::lonhtmlcommon::row_closure(1) + .&Apache::lonhtmlcommon::row_title($lt{'dmn'}) + .'' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title($lt{'dsh'}) + .'
' + .'
' + .'' + .' ' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_headline() + .$lt{'asov'} + .&Apache::lonhtmlcommon::row_closure(1) + .&Apache::lonhtmlcommon::end_pick_box() + .'' + .&Apache::loncommon::end_data_table_row() + .&Apache::loncommon::end_data_table() + .&Apache::lonhtmlcommon::row_closure() + ); + + $r->print(&Apache::lonhtmlcommon::row_headline() + .'

'.$lt{'assp'}.'

' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'oaas'}) + .'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_headline() + .'

'.$lt{'mssg'}.'

' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'scpf'}) + .'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'scfc'}) + .'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_headline() + .'

'.$lt{'cmmn'}.'

' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'dsrd'}) + .'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'dsuc'}) + .''.$lt{'acco'}.'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'snak'}) + .'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'kaut'}) + .'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_headline() + .'

'.$lt{'rshm'}.'

' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'rshm'}) + .'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_headline() + .'

'.$lt{'aens'}.'

' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'aadd'}) + .'' + .'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'audr'}) + .'' + .'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'dacu'}) + .$enroll_table + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'dacc'}) + .$access_table + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'psam'}) + .$lt{'pcda'}.'
' + .$krbform.'
' + .$intform.'
' + .$locform + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'nech'}) + .$lt{'nccl'}.'
' + .'' + .'' + .'
' + .$lt{'ndcl'}.'
' + .'' + .'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'irsp'}) + .' ' + .' ' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_headline() + .'

'.$lt{'cgrs'}.'

' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'cgrq'}) + .'Mb' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_headline() + .'

'.$lt{'cc'}.'

' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'user'}) + .'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'dmn'},"","LC_odd_row_value") + .$domform + .&Apache::lonhtmlcommon::row_closure(1) + + .&Apache::lonhtmlcommon::end_pick_box() + ); + + $r->print(< +

+ + + +

+ +ENDDOCUMENT + + } elsif ($crstype eq 'Group') { + $r->print(< -

Course Information

+

$lt{'ginf'}

-Course Title: - +

-Course Home Server:$course_home +

-Course ID/Number (optional) - +

-

Course Content

+

$lt{'grco'}

+ + + +
$lt{'cngr'}$lt{'cegr'}

-Map: - -Select Map + +$lt{'smap'}

-Do NOT generate as standard course -(only check if you know what you are doing): - -

-

-First Resource (standard courses only): -Blank + +
+($lt{'ocik'}): + +

+$lt{'fres'}
($lt{'stgo'}): +   -Syllabus +   -Navigate +

- -

Assessment Parameters

+
+ +
+ +
+
+
+ +
 
+$lt{'asov'}. +
+

+

+

$lt{'mssg'}

-Open all assessments: - + +
+

-

Messaging

+

$lt{'cmmn'}

-Set course policy feedback to Course Coordinator: - -

-Set content feedback to Course Coordinator: - + +
+

-

Communication

+

$lt{'acco'}

-Disable student resource discussion: -
-Disable student use of chatrooms: - + +
+

-

Access Control

+

$lt{'rshm'}

-Students need access key to enter course: - +

-

Course Coordinator

-Username: -

-Domain: $domform -

-Immediately expire own role as Course Coordinator: - +

$lt{'grts'}

+$lt{'grtq'} +Mb +

+
+

$lt{'gc'}

+

+

- - + +

+

+ + +

- - ENDDOCUMENT + } + $r->print($end_page); } # ====================================================== Phase two: make course sub create_course { my $r=shift; - my $topurl='/res/'.&Apache::lonnet::declutter($ENV{'form.topmap'}); - my $ccuname=$ENV{'form.ccuname'}; - my $ccdomain=$ENV{'form.ccdomain'}; - $ccuname=~s/\W//g; - $ccdomain=~s/\W//g; - my $cdescr=$ENV{'form.title'}; - my $curl=$ENV{'form.topmap'}; - my $bodytag=&Apache::loncommon::bodytag('Create a New Course'); - $r->print(< - -The LearningOnline Network with CAPA - -$bodytag -ENDENHEAD + my $ccuname =&LONCAPA::clean_username($env{'form.ccuname'}); + my $ccdomain=&LONCAPA::clean_domain($env{'form.ccdomain'}); + my $crstype = 'Group'; + my ($enrollstart,$enrollend,$startaccess,$endaccess); + + if ($env{'form.phase'} eq 'coursetwo') { + $crstype='Course'; + $enrollstart=&Apache::lonhtmlcommon::get_date_from_form('startenroll'); + $enrollend=&Apache::lonhtmlcommon::get_date_from_form('endenroll'); + } + $startaccess = &Apache::lonhtmlcommon::get_date_from_form('startaccess'); + $endaccess = &Apache::lonhtmlcommon::get_date_from_form('endaccess'); + + my $autharg; + my $authtype; + + if ($env{'form.login'} eq 'krb') { + $authtype = 'krb'; + $authtype .=$env{'form.krbver'}; + $autharg = $env{'form.krbarg'}; + } elsif ($env{'form.login'} eq 'int') { + $authtype ='internal'; + if ((defined($env{'form.intarg'})) && ($env{'form.intarg'})) { + $autharg = $env{'form.intarg'}; + } + } elsif ($env{'form.login'} eq 'loc') { + $authtype = 'localauth'; + if ((defined($env{'form.locarg'})) && ($env{'form.locarg'})) { + $autharg = $env{'form.locarg'}; + } + } + my $logmsg; + my $start_page=&Apache::loncommon::start_page('Create a New '.$crstype); + my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Creation Outcome','Create_Course',undef,'Create_Courses'); + + $r->print($start_page.$crumbs); + + my $args = { + crstype => $crstype, + ccuname => $ccuname, + ccdomain => $ccdomain, + cdescr => $env{'form.title'}, + curl => $env{'form.topmap'}, + course_domain => $env{'request.role.domain'}, + course_home => $env{'form.course_home'}, + nonstandard => $env{'form.nonstandard'}, + crscode => $env{'form.crscode'}, + crsquota => $env{'form.crsquota'}, + clonecourse => $env{'form.clonecourse'}, + clonedomain => $env{'form.clonedomain'}, + datemode => $env{'form.datemode'}, + dateshift => $env{'form.dateshift'}, + crsid => $env{'form.crsid'}, + curruser => $env{'user.name'}.':'.$env{'user.domain'}, + crssections => $env{'form.crssections'}, + crsxlist => $env{'form.crsxlist'}, + autoadds => $env{'form.autoadds'}, + autodrops => $env{'form.autodrops'}, + notify_owner => $env{'form.notify_owner'}, + notify_dc => $env{'form.notify_dc'}, + no_end_date => $env{'form.no_end_date'}, + showphotos => $env{'form.showphotos'}, + authtype => $authtype, + autharg => $autharg, + enrollstart => $enrollstart, + enrollend => $enrollend, + startaccess => $startaccess, + endaccess => $endaccess, + setpolicy => $env{'form.setpolicy'}, + setcontent => $env{'form.setcontent'}, + reshome => $env{'form.reshome'}, + setkeys => $env{'form.setkeys'}, + keyauth => $env{'form.keyauth'}, + disresdis => $env{'form.disresdis'}, + disablechat => $env{'form.disablechat'}, + openall => $env{'form.openall'}, + firstres => $env{'form.firstres'} + }; + # # Verify data # # Check the veracity of the course coordinator if (&Apache::lonnet::homeserver($ccuname,$ccdomain) eq 'no_host') { - $r->print('No such user '.$ccuname.' at '.$ccdomain.''); + $r->print('
'); + $r->print('
' + .&mt('No such user [_1] at domain [_2].',''.$ccuname.'',''.$ccdomain.'') + .'
'); + $r->print(&mt('Please click Back on your browser and select another user, or [_1]Create User[_2]' + , '' + .'' + .'' + .'' + ) + .'
'.&Apache::loncommon::end_page() + ); return; } # Check the proposed home server for the course - my %host_servers = &Apache::loncommon::get_library_servers - ($ENV{'request.role.domain'}); - if (! exists($host_servers{$ENV{'form.course_home'}})) { - $r->print('Invalid home server for course: '. - $ENV{'form.course_home'}.''); + my %host_servers = + &Apache::lonnet::get_servers($env{'request.role.domain'},'library'); + if (! exists($host_servers{$env{'form.course_home'}})) { + $r->print(&mt('Invalid home server for course: [_1]' + ,$env{'form.course_home'}.&Apache::loncommon::end_page())); return; } -# -# Open course -# - my $courseid=&Apache::lonnet::createcourse($ENV{'request.role.domain'}, - $cdescr,$curl, - $ENV{'form.course_home'}, - $ENV{'form.nonstandard'}); - - # Note: The testing routines depend on this being output; see - # Utils::Course. This needs to at least be output as a comment - # if anyone ever decides to not show this, and Utils::Course::new - # will need to be suitably modified. - $r->print('New LON-CAPA Course ID: '.$courseid.'
'); -# -# Check if created correctly -# - my ($crsudom,$crsunum)=($courseid=~/^\/(\w+)\/(\w+)$/); - my $crsuhome=&Apache::lonnet::homeserver($crsunum,$crsudom); - $r->print('Created on: '.$crsuhome.'
'); -# -# Set environment -# - my %cenv=(); - my $envflag=0; - if ($ENV{'form.crsid'}) { - $envflag=1; - $cenv{'courseid'}=$ENV{'form.crsid'}; - } - if (($ccdomain) && ($ccuname)) { - if ($ENV{'form.setpolicy'}) { - $envflag=1; - $cenv{'policy.email'}=$ccuname.':'.$ccdomain; - } - if ($ENV{'form.setcontent'}) { - $envflag=1; - $cenv{'question.email'}=$ccuname.':'.$ccdomain; - } - } - if ($ENV{'form.setkeys'}) { - $envflag=1; - $cenv{'keyaccess'}='yes'; - } - if ($ENV{'form.disresdis'}) { - $envflag=1; - $cenv{'pch.roles.denied'}='st'; + my ($courseid,$crsudom,$crsunum); + my ($success,$output) = + &Apache::loncommon::construct_course($args,\$logmsg,\$courseid, + \$crsudom,\$crsunum, + $env{'user.domain'}, + $env{'user.name'}); + $r->print($output); + if ($success) { + # + # Make the requested user a course coordinator or group coordinator + # + if (($ccdomain) && ($ccuname)) { + $r->print(&mt('Assigning role of '.$crstype.' Coordinator to [_1]:', + ,''.$ccuname.':'.$ccdomain.'') + .&Apache::lonnet::assignrole($ccdomain,$ccuname,$courseid, + 'cc','','','','','createcourse').'

'); + } + if ($env{'form.setkeys'}) { + $r->print( + '

'.&mt('Manage Access Keys').'

'); + } + # Flush the course logs so reverse user roles immediately updated + &Apache::lonnet::flushcourselogs(); + $r->print('

'.&mt('Roles will be active at next login').'.

'); } - if ($ENV{'form.disablechat'}) { - $envflag=1; - $cenv{'plc.roles.denied'}='st'; + $r->print('

'. + &mt("Create Another $crstype").'

'. + &Apache::loncommon::end_page()); +} + +sub print_intro_page { + my $r = shift; + my $start_page = + &Apache::loncommon::start_page('Create a New Course or Group Space'); + 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_GroupSpace',&mt('Help on Creating Courses and Groups')); + + my @choices = ({ internal_name => 'courseone', + name => &mt('Create a single course'), + short_description => + &mt('Create a new course by completing an online form.'), + }, + { internal_name => 'groupone', + name => &mt('Create a single collaborative group space'), + short_description => + &mt('Create a new group space for non-course use by completing an online form.'), + }, + { internal_name => 'batchone', + name => &mt('Create courses/groups by uploading an attributes file'), + short_description => + &mt('Upload an attributes file containing specifications for one or more courses or groups in XML format.'), + help => 'Batch_Creation', + }, + ); + my $options; + foreach my $choice (@choices) { + $options .='

'. + $choice->{'name'}.''; + if (exists($choice->{'help'})) { + $options .= &Apache::loncommon::help_open_topic($choice->{'help'}); + } + $options .= "

\n".' '.(' 'x8).$choice->{'short_description'}. + "\n"; } - # Record we've not yet viewed the Course Initialization Helper for this course - $cenv{'course.helper.not.run'} = 1; - # - # Use new Randomseed - # - $envflag=1; - $cenv{'rndseed'}=&Apache::lonnet::latest_rnd_algorithm_id();; - # - # By default, use standard grading - $cenv{'grading'} = 'standard'; + $r->print(<print('Setting environment: '. - &Apache::lonnet::put('environment',\%cenv,$crsudom,$crsunum).'
'); - } -# -# Open all assignments -# - if ($ENV{'form.openall'}) { - my $storeunder=$crsudom.'_'.$crsunum.'.0.opendate'; - my %storecontent = ($storeunder => time, - $storeunder.'type' => 'date_start'); - - $r->print('Opening all assignments: '.&Apache::lonnet::cput - ('resourcedata',\%storecontent,$crsudom,$crsunum).'
'); - } -# -# Set first page -# - unless (($ENV{'form.nonstandard'}) || ($ENV{'form.firstres'} eq 'blank')) { - $r->print('Setting first resource: '); - my ($errtext,$fatal)= - &Apache::londocs::mapread($crsunum,$crsudom,'default.sequence'); - $r->print(($fatal?$errtext:'read ok').' - '); - my $title; my $url; - if ($ENV{'form.firstres'} eq 'syl') { - $title='Syllabus'; - $url='/public/'.$crsudom.'/'.$crsunum.'/syllabus'; - } else { - $title='Navigate Contents'; - $url='/adm/navmaps'; +sub upload_batchfile { + my $r = shift; + my $start_page = + &Apache::loncommon::start_page('Create a New Course or Group Space'); + my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Upload Course/Group 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 groups attributes file').'

'); + $r->print('
'. + ''. + '

'. + '
'); + $r->print($end_page); + return; +} + +sub process_batchfile { + my $r = shift; + my $start_page = + &Apache::loncommon::start_page('Create a New Course or Group Space'); + 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 $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 (-e "$batchdir/processed/$filename") { + unlink("$batchdir/pending/$filename"); + } + } + } } - $Apache::lonratedt::resources[1]=$title.':'.$url.':false:start:res'; - ($errtext,$fatal)= - &Apache::londocs::storemap($crsunum,$crsudom,'default.sequence'); - $r->print(($fatal?$errtext:'write ok').'
'); - } -# -# Make current user course adminstrator -# - my $end=undef; - my $addition=''; - if ($ENV{'form.expireown'}) { $end=time+5; $addition='expired'; } - $r->print('Assigning '.$addition.' role of course coordinator to self: '. - &Apache::lonnet::assignrole( - $ENV{'user.domain'},$ENV{'user.name'},$courseid,'cc',$end).'
'); -# -# Make additional user course administrator -# - if (($ccdomain) && ($ccuname)) { - $r->print('Assigning role of course coordinator to '. - $ccuname.' at '.$ccdomain.': '. - &Apache::lonnet::assignrole($ccdomain,$ccuname,$courseid,'cc').'

'); - } - if ($ENV{'form.setkeys'}) { - $r->print( - '

Manage Access Keys

'); } - $r->print('

Roles will be active at next login.

'); + $r->print($start_page.$crumbs.$logmsg.$result.'
'. + &mt('Creation options menu').''.$end_page); + } # ===================================================================== Handler @@ -427,27 +892,66 @@ sub handler { my $r = shift; if ($r->header_only) { - $r->content_type('text/html'); + &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; return OK; } - if (&Apache::lonnet::allowed('ccc',$ENV{'request.role.domain'})) { - $r->content_type('text/html'); + if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) { + &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; - if ($ENV{'form.phase'} eq 'two') { + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, + ['phase']); + &Apache::lonhtmlcommon::clear_breadcrumbs(); + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"/adm/createcourse", + text=>"Creation Options", + faq=>79,bug=>'Dom Coord Interface',}); + if (($env{'form.phase'} eq 'coursetwo') || + ($env{'form.phase'} eq 'grouptwo')) { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"/adm/createcourse?phase=$env{'form.prevphase'}", + text=>&mt('[_1] Creation Settings',), + faq=>9,bug=>'Dom Coord Interface',}); + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"/adm/createcourse?phase=$env{'form.phase'}", + text=>"Creation Outcome", + faq=>9,bug=>'Dom Coord Interface',}); &create_course($r); - } else { + } elsif (($env{'form.phase'} eq 'courseone') || + ($env{'form.phase'} eq 'groupone')) { + &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 ($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 ($env{'form.phase'} eq 'batchtwo') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"/adm/createcourse?phase=$env{'form.prevphase'}", + text=>"Upload Description File", + faq=>9,bug=>'Dom Coord Interface',}); + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"/adm/createcourse?phase=$env{'form.phase'}", + text=>"Creation Outcome", + faq=>9,bug=>'Dom Coord Interface',}); + &process_batchfile($r); + } else { + &print_intro_page($r); } } else { - $ENV{'user.error.msg'}= - "/adm/createcourse:ccc:0:0:Cannot create courses"; + $env{'user.error.msg'}= + "/adm/createcourse:ccc:0:0:Cannot create courses or groups"; return HTTP_NOT_ACCEPTABLE; } return OK; -} +} 1; __END__