--- loncom/interface/loncreatecourse.pm 2013/07/22 18:06:51 1.150
+++ 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.150 2013/07/22 18:06:51 bisitz Exp $
+# $Id: loncreatecourse.pm,v 1.168 2017/11/04 01:12:19 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -82,7 +82,7 @@ use Apache::lonlocal;
use Apache::lonuserutils;
use Apache::lonclonecourse;
use LONCAPA::batchcreatecourse;
-use LONCAPA;
+use LONCAPA qw(:DEFAULT :match);
# ===================================================== Phase one: fill-in form
@@ -91,6 +91,8 @@ sub print_course_creation_page {
my $crstype = 'Community';
if ($env{'form.phase'} eq 'courseone') {
$crstype = 'Course';
+ } elsif ($env{'form.phase'} eq 'placementone') {
+ $crstype = 'Placement';
}
my $defdom=$env{'request.role.domain'};
my %domdefaults = &Apache::lonnet::get_domain_defaults($defdom);
@@ -104,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
@@ -116,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) =
@@ -133,6 +136,8 @@ sub print_course_creation_page {
} else {
my $title_alert = &mt('A Community title is required');
my $coord_alert = &mt('The username of the Coordinator is required');
+ &js_escape(\$title_alert);
+ &js_escape(\$coord_alert);
$javascript_validations = qq|
function validate(formname) {
if (formname.title == '') {
@@ -158,8 +163,9 @@ function validate(formname) {
'snid' => "Section Numbers and corresponding LON-CAPA section IDs",
'csli' => "a comma separated list of institutional section numbers, each separated by a colon from the (optional) corresponding section ID to be used in LON-CAPA e.g., 001:1,002:2",
'crcs' => "Crosslisted courses",
- 'cscs' => "a comma separated list of course sections crosslisted with the current course, with each entry including the institutional course section name followed by a colon and then the (optional) sectionID to be used in LON-CAPA, e.g., fs03ent231001:ent1,fs03bot231001:bot1,fs03zol231002:zol2",
+ 'cscs' => "a comma separated list of course sections crosslisted with the current course, with each entry including the institutional course section name followed by a colon and then the (optional) section ID to be used in LON-CAPA, e.g., fs03ent231001:ent1,fs03bot231001:bot1,fs03zol231002:zol2",
'ccre' => "Course credits",
+ 'crcd' => "Create six character course identifier to share with students",
'cred' => "the number of institutional credits students will earn by completing this course",
'crco' => "Course Content",
'cncr' => "Completely new course",
@@ -184,7 +190,8 @@ function validate(formname) {
'oaas' => "Open all assessments",
'mssg' => "Messaging",
'scpf' => "Set course policy feedback to Course Coordinator",
- 'scfc' => "Set content feedback to Course Coordinator",
+ 'scfc' => "Set resource content feedback to Course Coordinator",
+ 'scof' => "Set course content feedback to Course Coordinator",
'cmmn' => "Communication",
'dsrd' => "Disable student resource discussion",
'dsuc' => "Disable student use of chat rooms",
@@ -211,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]','','','','');
@@ -230,7 +238,8 @@ 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 content feedback to Coordinator');
+ $lt{'scfc'} = &mt('Set resource content feedback to Coordinator');
+ $lt{'scof'} = &mt('Set community 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');
@@ -241,6 +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');
+ } 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 = <'.$lt{'iinf'}.'
'
- .$lt{'stat'}.' '
- .&mt('Default credits can also be specified, if different from the domain defaults (official courses: [_1]; unofficial courses: [_2]).',
- $domdefaults{'officialcredits'},$domdefaults{'unofficialcredits'})
- .&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'}.')'
@@ -336,13 +360,24 @@ END
.'
('.$lt{'cscs'}.')'
.&Apache::lonhtmlcommon::row_closure()
);
- if ($domdefaults{'officialcredits'} || $domdefaults{'unofficialcredits'}) {
+ if (($crstype eq 'Course') && ($domdefaults{'officialcredits'} ||
+ $domdefaults{'unofficialcredits'} || $domdefaults{'textbookcredits'})) {
$r->print(&Apache::lonhtmlcommon::row_title($lt{'ccre'})
.''
.'
('.$lt{'cred'}.')'
.&Apache::lonhtmlcommon::row_closure()
);
}
+ $r->print(&Apache::lonhtmlcommon::row_title($lt{'crcd'})
+ .''
+ .''.&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()
@@ -368,15 +403,14 @@ END
.&Apache::lonhtmlcommon::row_closure()
.&Apache::lonhtmlcommon::row_title($lt{'fres'})
.''
- .' ');
+ .''.$lt{'blnk'}
+ .'');
if ($crstype eq 'Community') {
- $r->print('
+ + + +
' + ); } $r->print(''. $end_page); @@ -578,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'); @@ -639,6 +687,7 @@ 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'}, @@ -649,10 +698,14 @@ sub create_course { }; if (($crstype eq 'Course') && - ($domdefaults{'officialcredits'} || $domdefaults{'unofficialcredits'})) { + ($domdefaults{'officialcredits'} || $domdefaults{'unofficialcredits'} || $domdefaults{'textbookcredits'})) { $args->{'defaultcredits'} = $env{'form.defaultcredits'}; } + if ($env{'form.uniquecode'}) { + $args->{'uniquecode'} = 1; + } + # # Verify data # @@ -681,12 +734,12 @@ sub create_course { ,$env{'form.course_home'}.&Apache::loncommon::end_page())); return; } - my ($courseid,$crsudom,$crsunum); + my ($courseid,$crsudom,$crsunum,$code); my ($success,$output) = &Apache::loncommon::construct_course($args,\$logmsg,\$courseid, \$crsudom,\$crsunum, $env{'user.domain'}, - $env{'user.name'},'dc_create'); + $env{'user.name'},'dc_create',undef,undef,\$code); $r->print($output); if ($success) { # @@ -706,6 +759,11 @@ sub create_course { $r->print( ''); } + if ($code) { + $r->print( + ''.&mt('Course identifier to share with students: [_1]',$code).'
' + ); + } # 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').'.
'); @@ -716,15 +774,19 @@ sub create_course { } sub print_intro_page { - my ($r,$show_all_choices) = @_; + 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(); 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', @@ -732,7 +794,7 @@ sub print_intro_page { { linktext => 'Create a single course', url => '/adm/createcourse?phase=courseone', - permission => 1, + permission => $permission->{'create'}, #help => '', icon => 'crsnew.png', linktitle => 'Create a new course by completing an online form.' @@ -740,30 +802,38 @@ sub print_intro_page { { linktext => 'Create a single community', url => '/adm/createcourse?phase=groupone', - permission => $show_all_choices, + permission => $permission->{'create'} && $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 => $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 => 1, + 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.' }, ] }, { categorytitle => 'Course/Community Requests', items => [ { - linktext => 'Approve or reject requests', + linktext => $approve, 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', @@ -784,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.' }, ] }, @@ -801,60 +871,78 @@ 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('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.').'