version 1.2, 2005/03/02 19:50:52
|
version 1.13, 2006/05/30 20:05:10
|
Line 1
|
Line 1
|
|
# |
|
# $Id$ |
|
# |
|
# Copyright Michigan State University Board of Trustees |
|
# |
|
# This file is part of the LearningOnline Network with CAPA (LON-CAPA). |
|
# |
|
# LON-CAPA is free software; you can redistribute it and/or modify |
|
# it under the terms of the GNU General Public License as published by |
|
# the Free Software Foundation; either version 2 of the License, or |
|
# (at your option) any later version. |
|
# |
|
# LON-CAPA is distributed in the hope that it will be useful, |
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
# GNU General Public License for more details. |
|
# |
|
# You should have received a copy of the GNU General Public License |
|
# along with LON-CAPA; if not, write to the Free Software |
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
# |
|
# /home/httpd/html/adm/gpl.txt |
|
# |
|
# http://www.lon-capa.org/ |
|
# |
|
|
package LONCAPA::batchcreatecourse; |
package LONCAPA::batchcreatecourse; |
use LONCAPA::Configuration; |
use LONCAPA::Configuration; |
use LONCAPA::Enrollment; |
use LONCAPA::Enrollment; |
Line 10 use Apache::loncreatecourse;
|
Line 36 use Apache::loncreatecourse;
|
use Apache::loncreateuser; |
use Apache::loncreateuser; |
use Apache::lonlocal; |
use Apache::lonlocal; |
|
|
|
use strict; |
|
|
# Collection of routines used for batch creation of courses and users. |
# Collection of routines used for batch creation of courses and users. |
# &create_courses() should be called by an Autocreate.pl |
# &create_courses() should be called by an Autocreate.pl |
# script via a cron entry, or alternatively from a web page, after upload |
# script via a cron entry, or alternatively from a web page, after upload |
# of a file containing an XML description of a course request (lonbatchccrs.pm). |
# of a file containing an XML description of a course request (lonbatchccrs.pm). |
# |
# |
# XML file(s) describing courses that are to be created in domain $dom are stored in |
# XML file(s) describing courses that are to be created in domain $dom are stored in |
# /home/httpd/perl/tmp/addcourse/$dom. Each XML file is deleted after it has been |
# /home/httpd/perl/tmp/addcourse/$dom |
# parsed. |
|
# |
# |
# &create_courses() will create an account for the course owner |
# &create_courses() will create an account for the course owner |
# (if one does not currently exist), will create the course (cloning if necessary), |
# (if one does not currently exist), will create the course (cloning if necessary), |
Line 137 use Apache::lonlocal;
|
Line 164 use Apache::lonlocal;
|
# files listed in @$requests are deleted |
# files listed in @$requests are deleted |
# after the files have been parsed. |
# after the files have been parsed. |
# |
# |
# Directory searched for files listed in @$requests |
# Directory for retrieval of files listed in @$requests is: |
# is /home/httpd/perl/tmp/addcourse/$dom/auto if $context is auto |
# /home/httpd/perl/tmp/addcourse/$dom/auto/pending if $context = auto |
# and /home/httpd/perl/tmp/addcourse/$dom/web/$uname if $context is web |
# /home/httpd/perl/tmp/addcourse/$dom/web/$uname_$udom/pending if $context = web |
# |
# |
# inputs (five) - requests - ref to array of filename(s) containing course requests |
# inputs (five) - requests - ref to array of filename(s) containing course requests |
# courseids - ref to hash to store LON-CAPA course ids of new courses |
# courseids - ref to hash to store LON-CAPA course ids of new courses |
# context - auto if called from command line, web if called from browser |
# context - auto if called from command line, web if called from browser |
# dom - domain for which the course is being created |
# dom - domain for which the course is being created |
# uname - username of DC who is requesting course creation from browser |
# uname - username of DC who is requesting course creation |
|
# udom - domain of DC who is requesting course creation |
# |
# |
# outputs (three) - output - text recording user roles added etc. |
# outputs (three) - output - text recording user roles added etc. |
# logmsg - text to be logged |
# logmsg - text to be logged |
Line 153 use Apache::lonlocal;
|
Line 181 use Apache::lonlocal;
|
############################################################# |
############################################################# |
|
|
sub create_courses { |
sub create_courses { |
my ($requests,$courseids,$context,$dom,$uname) = @_; |
my ($requests,$courseids,$context,$dom,$uname,$udom) = @_; |
my $output; |
my $output; |
my $perlvarref = LONCAPA::Configuration::read_conf('loncapa.conf'); |
my $perlvarref = LONCAPA::Configuration::read_conf('loncapa.conf'); |
# Get role names |
# Get role names |
my %longroles = (); |
my %longroles = (); |
open(FILE,"<$perlvarref{'lonTabDir'}.'/rolesplain.tab"); |
open(FILE,"<$$perlvarref{'lonTabDir'}.'/rolesplain.tab"); |
my @rolesplain = <FILE>; |
my @rolesplain = <FILE>; |
close(FILE); |
close(FILE); |
foreach (@rolesplain) { |
foreach (@rolesplain) { |
Line 169 sub create_courses {
|
Line 197 sub create_courses {
|
my ($logmsg,$keysmsg,$newusermsg,$addresult); |
my ($logmsg,$keysmsg,$newusermsg,$addresult); |
my %enrollcount = (); |
my %enrollcount = (); |
my $newcoursedir = $$perlvarref{'lonDaemons'}.'/tmp/addcourse/'.$dom.'/'.$context; |
my $newcoursedir = $$perlvarref{'lonDaemons'}.'/tmp/addcourse/'.$dom.'/'.$context; |
if ($uname) { |
if ($context eq 'auto') { |
unless ($context eq 'auto') { |
$newcoursedir .= '/pending'; |
$newcoursedir .= '/'.$uname; |
} else { |
|
if ($uname && $udom) { |
|
$newcoursedir .= '/'.$uname.'_'.$udom.'/pending'; |
|
} else { |
|
$logmsg = "batchcreatecourse::create_courses() called without username and/or domain of requesting Domain Coordinator"; |
} |
} |
} |
} |
if (@{$requests} > 0) { |
if (@{$requests} > 0) { |
Line 181 sub create_courses {
|
Line 213 sub create_courses {
|
&parse_coursereqs($newcoursedir.'/'.$request, \%details); |
&parse_coursereqs($newcoursedir.'/'.$request, \%details); |
foreach my $num (sort keys %details) { |
foreach my $num (sort keys %details) { |
my $courseid = &build_course($dom,$num,$context,\%details,\%longroles,\$logmsg,\$newusermsg,\$addresult,\%enrollcount,\$output,\$keysmsg); |
my $courseid = &build_course($dom,$num,$context,\%details,\%longroles,\$logmsg,\$newusermsg,\$addresult,\%enrollcount,\$output,\$keysmsg); |
$$courseids{$courseid} = $enrollcount; |
$$courseids{$courseid} = $details{$num}{'class'}; |
} |
} |
} |
} |
} |
} |
Line 262 sub parse_coursereqs {
|
Line 294 sub parse_coursereqs {
|
} elsif ("@state" eq "class owner authtype") { |
} elsif ("@state" eq "class owner authtype") { |
$$details{$num}{'ownerauthtype'} = $text; |
$$details{$num}{'ownerauthtype'} = $text; |
} elsif ("@state" eq "class owner autharg") { |
} elsif ("@state" eq "class owner autharg") { |
$$details{$num}{'ownerautharg'} = $text; |
$$details{$num}{'ownerauthparam'} = $text; |
} elsif ("@state" eq "class authentication method") { |
} elsif ("@state" eq "class authentication method") { |
$$details{$num}{'authtype'} = $text; |
$$details{$num}{'authtype'} = $text; |
} elsif ("@state" eq "class authentication param") { |
} elsif ("@state" eq "class authentication param") { |
Line 320 sub parse_coursereqs {
|
Line 352 sub parse_coursereqs {
|
|
|
$p->parse_file($coursefile); |
$p->parse_file($coursefile); |
$p->eof; |
$p->eof; |
if (-e "$coursefile") { |
|
# unlink $coursefile; |
|
} |
|
return; |
return; |
} |
} |
|
|
Line 349 sub parse_coursereqs {
|
Line 378 sub parse_coursereqs {
|
######################################################### |
######################################################### |
|
|
sub build_course { |
sub build_course { |
my ($cdom,$num,$context,$details,$longoles,$logmsg,$newusermsg,$addresult,$enrollcount,$output,$keysmsg) = @_; |
my ($cdom,$num,$context,$details,$longroles,$logmsg,$newusermsg,$addresult,$enrollcount,$output,$keysmsg,$udom,$uname) = @_; |
my $owner_uname = $$details{$num}{'owner'}; |
my $owner_uname = $$details{$num}{'owner'}; |
my $owner_domain = $$details{$num}{'domain'}; |
my $owner_domain = $$details{$num}{'domain'}; |
my $owner = $owner_uname.':'.$owner_domain; |
my $owner = $owner_uname.':'.$owner_domain; |
Line 376 sub build_course {
|
Line 405 sub build_course {
|
$firstres = 'syl'; |
$firstres = 'syl'; |
} |
} |
foreach my $secid (sort keys %{$$details{$num}{'sections'}}) { |
foreach my $secid (sort keys %{$$details{$num}{'sections'}}) { |
$sectionstr .= $$details{$num}{'sections'}{$secid}{'inst'}.':'.$$details{$num}{'sections'}{$secid}{'loncapa'}; |
$sectionstr .= $$details{$num}{'sections'}{$secid}{'inst'}.':'.$$details{$num}{'sections'}{$secid}{'loncapa'}.','; |
} |
} |
|
$sectionstr =~ s/,$//; |
|
|
foreach my $xlist (sort keys %{$$details{$num}{'crosslists'}}) { |
foreach my $xlist (sort keys %{$$details{$num}{'crosslists'}}) { |
$xliststr .= $$details{$num}{'crosslists'}{$xlist}{'inst'}.':'.$$details{$num}{'crosslists'}{$xlist}{'loncapa'}; |
$xliststr .= $$details{$num}{'crosslists'}{$xlist}{'inst'}.':'.$$details{$num}{'crosslists'}{$xlist}{'loncapa'}.','; |
} |
} |
|
$xliststr =~ s/,$//; |
|
|
my %courseinfo = ( |
my %courseinfo = ( |
inst_code => $$details{$num}{'coursecode'}, |
inst_code => $$details{$num}{'coursecode'}, |
description => $$details{$num}{'title'} |
description => $$details{$num}{'title'} |
); |
); |
if (&Apache::lonnet::homeserver($$details{$num}{'owner'},$$details{$num}{'domain'}) eq 'no_host') { # Add user if no account |
if (&Apache::lonnet::homeserver($$details{$num}{'owner'},$$details{$num}{'domain'}) eq 'no_host') { # Add user if no account |
my $ownerargs = ('auth' => $$details{$num}{'ownerauthtype'}, |
my $ownerargs = {'auth' => $$details{$num}{'ownerauthtype'}, |
'authparam' => $$details{$num}{'ownerauthparam'}, |
'authparam' => $$details{$num}{'ownerauthparam'}, |
'emailenc' => $$details{$num}{'emailenc'}, |
'emailenc' => $$details{$num}{'emailenc'}, |
'dom' => $$details{$num}{'domain'}, |
'udom' => $$details{$num}{'domain'}, |
'uname' => $$details{$num}{'owner'}, |
'uname' => $$details{$num}{'owner'}, |
'pid' => '', |
'pid' => $$details{$num}{'users'}{$owner}{'studentID'}, |
'first' => $$details{$num}{'users'}{$owner}{'first'}, |
'first' => $$details{$num}{'users'}{$owner}{'firstname'}, |
'middle' => $$details{$num}{'users'}{$owner}{'middle'}, |
'middle' => $$details{$num}{'users'}{$owner}{'middlename'}, |
'last' => $$details{$num}{'users'}{$owner}{'last'}, |
'last' => $$details{$num}{'users'}{$owner}{'lastname'}, |
'gene' => $$details{$num}{'users'}{$owner}{'gene'}, |
'gene' => $$details{$num}{'users'}{$owner}{'generation'}, |
'usec' => '', |
'usec' => '', |
'end' => '', |
'end' => '', |
'start' => '', |
'start' => '', |
Line 405 sub build_course {
|
Line 436 sub build_course {
|
'cid' => '', |
'cid' => '', |
'context' => 'createowner', |
'context' => 'createowner', |
'linefeed' => $linefeed, |
'linefeed' => $linefeed, |
'role' => 'cc' |
'role' => 'cc', |
); |
}; |
$outcome = &LONCAPA::Enrollment::create_newuser($ownerargs,$logmsg,$newusermsg,$enrollcount,$addresult,$longroles,$courseinfo); |
$outcome = &LONCAPA::Enrollment::create_newuser($ownerargs,$logmsg,$newusermsg,$enrollcount,$addresult,$longroles,\%courseinfo); |
} else { |
} else { |
$outcome = 'ok'; |
$outcome = 'ok'; |
} |
} |
|
|
my $courseargs = { |
if ($outcome eq 'ok') { |
|
my $courseargs = { |
ccuname => $$details{$num}{'owner'}, |
ccuname => $$details{$num}{'owner'}, |
ccdomain => $$details{$num}{'domain'}, |
ccdomain => $$details{$num}{'domain'}, |
cdescr => $$details{$num}{'title'}, |
cdescr => $$details{$num}{'title'}, |
Line 439 sub build_course {
|
Line 471 sub build_course {
|
enrollend => $$details{$num}{'enrollend'}, |
enrollend => $$details{$num}{'enrollend'}, |
startaccess => $$details{$num}{'accessstart'}, |
startaccess => $$details{$num}{'accessstart'}, |
endaccess => $$details{$num}{'accessend'}, |
endaccess => $$details{$num}{'accessend'}, |
setpolicy => $Sdetails{$num}{'setpolicy'}, |
setpolicy => $$details{$num}{'setpolicy'}, |
setcontent => $$details{$num}{'setcontent'}, |
setcontent => $$details{$num}{'setcontent'}, |
reshome => $reshome, |
reshome => $reshome, |
setkeys => $$details{$num}{'setkeys'}, |
setkeys => $$details{$num}{'setkeys'}, |
Line 450 sub build_course {
|
Line 482 sub build_course {
|
firstres => $firstres |
firstres => $firstres |
}; |
}; |
|
|
if ($outcome eq 'ok') { |
|
my %host_servers = &Apache::loncommon::get_library_servers($cdom); |
my %host_servers = &Apache::loncommon::get_library_servers($cdom); |
if (! exists($host_servers{$$details{$num}{'coursehome'}})) { |
if (! exists($host_servers{$$details{$num}{'coursehome'}})) { |
$$logmsg .= &mt('Invalid home server for course').': '.$$details{$num}{'coursehome'}; |
$$logmsg .= &mt('Invalid home server for course').': '.$$details{$num}{'coursehome'}; |
return; |
return; |
} |
} |
|
|
&Apache::loncreatecourse::construct_course($courseargs,$logmsg,\$courseid,\$crsudom,\$crsunum); |
&Apache::loncreatecourse::construct_course($courseargs,$logmsg,\$courseid,\$crsudom,\$crsunum,$udom,$uname); |
} else { |
} else { |
return; |
return; |
} |
} |
Line 479 sub build_course {
|
Line 510 sub build_course {
|
my ($username,$userdom) = split/:/,$userkey; |
my ($username,$userdom) = split/:/,$userkey; |
if (&Apache::lonnet::homeserver($username,$userdom) eq 'no_host') { # Add user if no account |
if (&Apache::lonnet::homeserver($username,$userdom) eq 'no_host') { # Add user if no account |
my $firstrole = $$details{$num}{'users'}{$userkey}{'roles'}[0]; |
my $firstrole = $$details{$num}{'users'}{$userkey}{'roles'}[0]; |
my $firssec = $$details{$num}{'users'}{$userkey}{$firstrole}{'usec'}[0]; |
my $firstsec = $$details{$num}{'users'}{$userkey}{$firstrole}{'usec'}[0]; |
my $userargs = ('auth' => $$details{$num}{'users'}{$userkey}{'authtype'}, |
my $userargs = { |
'authparam' => $$details{$num}{'users'}{$userkey}{'authparam'}, |
'auth' => $$details{$num}{'users'}{$userkey}{'authtype'}, |
|
'authparam' => $$details{$num}{'users'}{$userkey}{'autharg'}, |
'emailenc' => $$details{$num}{'users'}{$userkey}{'emailenc'}, |
'emailenc' => $$details{$num}{'users'}{$userkey}{'emailenc'}, |
'dom' => $userdom, |
'udom' => $userdom, |
'uname' => $username, |
'uname' => $username, |
'pid' => $$details{$num}{'users'}{$userkey}{'studentID'}, |
'pid' => $$details{$num}{'users'}{$userkey}{'studentID'}, |
'first' => $$details{$num}{'users'}{$userkey}{'first'}, |
'first' => $$details{$num}{'users'}{$userkey}{'firstname'}, |
'middle' => $$details{$num}{'users'}{$userkey}{'middle'}, |
'middle' => $$details{$num}{'users'}{$userkey}{'middlename'}, |
'last' => $$details{$num}{'users'}{$userkey}{'last'}, |
'last' => $$details{$num}{'users'}{$userkey}{'lastname'}, |
'gene' => $$details{$num}{'users'}{$userkey}{'gene'}, |
'gene' => $$details{$num}{'users'}{$userkey}{'generation'}, |
'usec' => $firstsec, |
'usec' => $firstsec, |
'end' => $$details{$num}{'users'}{$userkey}{'end'}, |
'end' => $$details{$num}{'users'}{$userkey}{'end'}, |
'start' => $$details{$num}{'users'}{$userkey}{'start'}, |
'start' => $$details{$num}{'users'}{$userkey}{'start'}, |
'emailaddr' => $$details{$num}{'users'}{$userkey}{'email'}, |
'emailaddr' => $$details{$num}{'users'}{$userkey}{'emailaddr'}, |
'cid' => $courseid, |
'cid' => $courseid, |
|
'crs' => $crsunum, |
|
'cdom' => $crsudom, |
'context' => 'createcourse', |
'context' => 'createcourse', |
'linefeed' => $linefeed, |
'linefeed' => $linefeed, |
'role' => $$details{$num}{'users'}{$userkey}{'roles'}[0], |
'role' => $$details{$num}{'users'}{$userkey}{'roles'}[0], |
); |
}; |
$outcome = &LONCAPA::Enrollment::create_newuser($userargs,$logmsg,$newusermsg,$enrollcount,$addresult,$longroles,$courseinfo); |
$outcome = &LONCAPA::Enrollment::create_newuser($userargs,$logmsg,$newusermsg,$enrollcount,$addresult,$longroles,\%courseinfo); |
# now add other roles and other sections. |
# now add other roles and other sections. |
if ($outcome eq 'ok') { |
if ($outcome eq 'ok') { |
if (($firstrole ne 'st') && (@{$$details{$num}{'users'}{$userkey}{$firstrole}{'usec'}} > 1)) { |
if (($firstrole ne 'st') && (@{$$details{$num}{'users'}{$userkey}{$firstrole}{'usec'}} > 1)) { |
Line 557 sub build_course {
|
Line 591 sub build_course {
|
if ($usec ne '') { |
if ($usec ne '') { |
$url .= '/'.$usec; |
$url .= '/'.$usec; |
} |
} |
$$output .= &Apache::loncreateuser::commit_standardrole($userdom,$username,$url,$curr_role,$start,$end,$crsudom,$crsunum,$usec); |
my $stdresult = &Apache::loncreateuser::commit_standardrole($userdom,$username,$url,$curr_role,$start,$end,$crsudom,$crsunum,$usec); |
$url = '/'.$crsudom.'/'.$crsunum; |
$$output .= $stdresult; |
if ($usec ne '') { |
|
$url .= '/'.$usec; |
|
} |
|
} |
} |
} else { |
} else { |
|
$url = '/'.$crsudom.'/'.$crsunum; |
$$output .= &Apache::loncreateuser::commit_standardrole($userdom,$username,$url,$curr_role,$start,$end,$crsudom,$crsunum,''); |
$$output .= &Apache::loncreateuser::commit_standardrole($userdom,$username,$url,$curr_role,$start,$end,$crsudom,$crsunum,''); |
} |
} |
} |
} |
Line 594 sub build_course {
|
Line 626 sub build_course {
|
sub process_date { |
sub process_date { |
my $timestr = shift; |
my $timestr = shift; |
my $timestamp = ''; |
my $timestamp = ''; |
if ($timestr eq "No end date") { |
if ($timestr !~ /:/) { |
$timestamp = ''; |
$timestamp = ''; |
} else { |
} else { |
my @entries = split/:/,$timestr; |
my @entries = split(/:/,$timestr); |
for (my $j=0; $j<@entries; $j++) { |
for (my $j=0; $j<@entries; $j++) { |
if ( length($entries[$j]) > 1 ) { |
if ( length($entries[$j]) > 1 ) { |
$entries[$j] =~ s/^0//; |
$entries[$j] =~ s/^0//; |
} |
} |
|
$entries[$j] =~ s/\D//g; |
|
if ($entries[$j] < 0) { |
|
$entries[$j] = 0; |
|
} |
|
} |
|
if ($entries[1] > 0) { |
|
$entries[1] = $entries[1] - 1; |
|
} |
|
if ($entries[5] > 60) { |
|
$entries[5] = 60; |
|
} |
|
if ($entries[4] > 59) { |
|
$entries[4] = 59; |
|
} |
|
if ($entries[3] > 23) { |
|
$entries[3] = 23; |
|
} |
|
if ($entries[2] > 31) { |
|
$entries[2] = 31; |
|
} |
|
if ($entries[1] > 11) { |
|
$entries[1] = 11; |
|
} |
|
if ($entries[2] == 31) { |
|
if (($entries[1] == 3) || ($entries[1] == 5) || |
|
($entries[1] == 8) || ($entries[1] == 10)) { |
|
$entries[2] = 30; |
|
} |
} |
} |
$entries[1] = $entries[1] - 1; |
if ($entries[1] == 1) { |
|
if ($entries[2] > 29) { |
|
$entries[2] = 29; |
|
} |
|
if ($entries[2] == 29) { |
|
if ($entries[0]%4 != 0) { |
|
$entries[2] == 28; |
|
} elsif ( $entries[0]%100 == 0 |
|
&& $entries[0]%400 != 0) { |
|
$entries[2] == 28; |
|
} |
|
} |
|
} |
$timestamp = timelocal($entries[5],$entries[4],$entries[3],$entries[2],$entries[1],$entries[0]); |
$timestamp = timelocal($entries[5],$entries[4],$entries[3],$entries[2],$entries[1],$entries[0]); |
} |
} |
return $timestamp; |
return $timestamp; |