--- loncom/interface/loncreatecourse.pm 2020/07/17 23:28:21 1.158.2.3.2.3
+++ loncom/interface/loncreatecourse.pm 2017/11/04 01:12:19 1.168
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Create a course
#
-# $Id: loncreatecourse.pm,v 1.158.2.3.2.3 2020/07/17 23:28:21 raeburn Exp $
+# $Id: loncreatecourse.pm,v 1.168 2017/11/04 01:12:19 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -80,6 +80,7 @@ use Apache::loncommon;
use Apache::londocs;
use Apache::lonlocal;
use Apache::lonuserutils;
+use Apache::lonclonecourse;
use LONCAPA::batchcreatecourse;
use LONCAPA qw(:DEFAULT :match);
@@ -90,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 +106,8 @@ sub print_course_creation_page {
$course_home .= qq{>$server $host_servers{$server}};
}
$course_home .= "\n\n";
- my $domform = &Apache::loncommon::select_dom_form($defdom,'ccdomain');
+ my ($trusted,$untrusted) = &Apache::lonnet::trusted_domains('enroll',$defdom);
+ my $domform = &Apache::loncommon::select_dom_form($defdom,'ccdomain',undef,undef,undef,$trusted,$untrusted);
my $cloneform=&Apache::loncommon::select_dom_form
($env{'request.role.domain'},'clonedomain').
&Apache::loncommon::selectcourse_link
@@ -115,7 +119,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) =
@@ -182,10 +186,6 @@ function validate(formname) {
'ncd' => "Do not clone date parameters",
'prd' => 'Clone date parameters as-is',
'shd' => 'Shift date parameters by number of days',
- 'dpl' => 'URL shortcuts (for deep linking)',
- 'nsl' => 'Do not clone URL shortcuts',
- 'tsl' => 'Transfer URL shortcuts from existing course to new course',
- 'csl' => 'Create new URL shortcuts in new course',
'assp' => "Assessment Parameters",
'oaas' => "Open all assessments",
'mssg' => "Messaging",
@@ -218,6 +218,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','','');
$lt{'toin'} = &mt('to interface with institutional data, e.g., [_1]fs13glg231[_2] for [_3]Fall 2013 Geology 231[_4]','','','','');
@@ -249,8 +250,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');
- $lt{'tsl'} = &mt('Transfer URL shortcuts from existing community to new community');
- $lt{'csl'} = &mt('Create new URL shortcuts in new community');
+ } 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 = <
@@ -279,6 +290,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);
@@ -323,14 +335,16 @@ END
.''
.&Apache::lonhtmlcommon::row_closure()
);
- if ($crstype eq 'Course') {
+ if (($crstype eq 'Course') || ($crstype eq 'Placement')) {
$r->print(&Apache::lonhtmlcommon::row_headline()
.'
'.$lt{'iinf'}.'
'
- .$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'})
.''
.' ('.$lt{'toin'}.')'
@@ -346,7 +360,8 @@ END
.' ('.$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'})
.''
.' ('.$lt{'cred'}.')'
@@ -358,7 +373,11 @@ 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()
@@ -384,15 +403,14 @@ END
.&Apache::lonhtmlcommon::row_closure()
.&Apache::lonhtmlcommon::row_title($lt{'fres'})
.''
- .' ');
+ .''.$lt{'blnk'}
+ .'');
if ($crstype eq 'Community') {
- $r->print(''
.' '
.&Apache::lonhtmlcommon::row_closure()
- .&Apache::lonhtmlcommon::row_title($tinyurlhelp.$lt{'dpl'})
- .''
- .' '.$lt{'nsl'}
- .' '
- .''
- .' '.$lt{'tsl'}
- .' '
- .''
- .' '.$lt{'csl'}
- .''
- .&Apache::lonhtmlcommon::row_closure()
.&Apache::lonhtmlcommon::row_headline()
.''.$lt{'asov'}.''
.&Apache::lonhtmlcommon::row_closure(1)
@@ -517,7 +523,7 @@ END
.''
.&Apache::lonhtmlcommon::row_closure()
);
- if ($crstype eq 'Course') {
+ unless ($crstype eq 'Community') {
$r->print(&Apache::lonhtmlcommon::row_headline()
.'
'.$lt{'aens'}.'
'
.&Apache::lonhtmlcommon::row_closure()
@@ -590,6 +596,14 @@ END
'
+ );
}
$r->print(''.
$end_page);
@@ -610,6 +624,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');
@@ -653,7 +669,6 @@ sub create_course {
clonedomain => $env{'form.clonedomain'},
datemode => $env{'form.datemode'},
dateshift => $env{'form.dateshift'},
- tinyurls => $env{'form.tinyurls'},
crsid => $env{'form.crsid'},
curruser => $env{'user.name'}.':'.$env{'user.domain'},
crssections => $env{'form.crssections'},
@@ -720,20 +735,12 @@ sub create_course {
return;
}
my ($courseid,$crsudom,$crsunum,$code);
- my ($success,$output,$clonemsgref) =
+ my ($success,$output) =
&Apache::loncommon::construct_course($args,\$logmsg,\$courseid,
\$crsudom,\$crsunum,
$env{'user.domain'},
$env{'user.name'},'dc_create',undef,undef,\$code);
$r->print($output);
- if (ref($clonemsgref) eq 'ARRAY') {
- my $user_lh = &Apache::loncommon::user_lang($env{'user.name'},$env{'user.domain'});
- foreach my $item (@{$clonemsgref}) {
- if (ref($item) eq 'HASH') {
- $r->print(&mt($item->{mt},@{$item->{args}}).' '."\n");
- }
- }
- }
if ($success) {
#
# Make the requested user a course coordinator or group coordinator
@@ -769,7 +776,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();
@@ -801,12 +808,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.'
},
]
},
@@ -818,7 +833,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',
@@ -839,7 +854,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.'
},
]
},
@@ -856,18 +871,18 @@ 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;
}
@@ -878,7 +893,7 @@ sub process_batchfile {
my $uname = $env{'user.name'};
my $udom = $env{'user.domain'};
my $dir = &LONCAPA::tempdir().'addcourse';
- my ($result,$logmsg,$clonemsg,$keysmsg,$codesref,$instcodesref
+ my ($result,$logmsg);
if (($defdom =~ /^$match_domain$/) && ($uname =~ /^$match_username$/) && ($udom =~/^$match_domain$/)) {
my $batchfilepath=&Apache::lonnet::userfileupload('coursecreatorxml',undef,
'batchupload',undef,undef,
@@ -886,22 +901,21 @@ sub process_batchfile {
if ($batchfilepath =~ m{^(\Q$dir/$defdom/web/$uname\_$udom\E)/pending/([^/]+)$}) {
my ($batchdir,$filename) = ($1,$2);
if (-e "$batchfilepath") {
- if (open(FILE,"<",$batchfilepath)) {
+ if (open(FILE,"<$batchfilepath")) {
my @buffer = ;
close(FILE);
if ((defined($filename)) && (defined($batchdir))) {
my @requests = ($filename);
my %courseids = ();
- ($result,$logmsg,$clonemsg,$keysmsg,$codesref,$instcodesref) =
- &LONCAPA::batchcreatecourse::create_courses(
- \@requests,\%courseids,'web',$defdom,
- $uname,$udom);
+ ($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")) {
+ if (open(FILE,">$batchdir/processed/$filename")) {
print FILE @buffer;
close(FILE);
}
@@ -910,9 +924,6 @@ sub process_batchfile {
unlink("$batchdir/pending/$filename");
}
}
- if ($clonemsg) {
- $clonemsg = '
'.$clonemsg.'
'."\n";
- }
}
} else {
$result = '
'.&mt('Could not open attributes file.').' '.&mt('No courses created.').'
';
@@ -929,9 +940,10 @@ sub process_batchfile {
}
$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.$clonemsg.$result.' '.
+ $logmsg.$result.' '.
&mt('Creation options menu').''.
&Apache::loncommon::end_page());
+
}
sub courserequestbrowser_javascript {
@@ -1015,6 +1027,8 @@ sub print_creation_logs {
$crstype = '.';
} elsif ($curr{'type'} eq 'community') {
$crstype = 'Community';
+ } elsif ($curr{'type'} eq 'placement') {
+ $crstype = 'Placement';
}
my ($instcodefilter,$regexpok);
@@ -1105,6 +1119,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 '') {
@@ -1335,13 +1351,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))) {
@@ -1362,8 +1379,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',),
@@ -1374,9 +1393,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',),
@@ -1417,7 +1438,7 @@ sub handler {
$context,$env{'request.role.domain'}).''.
&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",
@@ -1456,7 +1477,7 @@ sub handler {
$context,$env{'request.role.domain'}).''.
&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",
@@ -1466,9 +1487,7 @@ sub handler {
my $start_page=&Apache::loncommon::start_page('Requests Validation Result',$js);
my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Validation Attempted','Course_Requests',undef,'Course_Requests');
$r->print($start_page.$crumbs."\n".'