--- loncom/interface/loncreatecourse.pm 2013/07/22 18:06:51 1.150
+++ loncom/interface/loncreatecourse.pm 2017/11/17 01:02:28 1.158.2.3.2.2
@@ -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.158.2.3.2.2 2017/11/17 01:02:28 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
@@ -133,6 +133,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 +160,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 +187,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",
@@ -230,7 +234,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');
@@ -317,8 +322,8 @@ END
$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]).',
- $domdefaults{'officialcredits'},$domdefaults{'unofficialcredits'})
+ .&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()
.&Apache::lonhtmlcommon::row_title($lt{'ccod'})
@@ -336,13 +341,19 @@ END
.' ('.$lt{'cscs'}.')'
.&Apache::lonhtmlcommon::row_closure()
);
- if ($domdefaults{'officialcredits'} || $domdefaults{'unofficialcredits'}) {
+ if ($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()
+ );
}
# Table: New Course / Clone Course
$r->print(&Apache::lonhtmlcommon::row_headline()
@@ -453,6 +464,10 @@ 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()
@@ -639,6 +654,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 +665,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 +701,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 +726,11 @@ sub create_course {
$r->print(
''.&mt('Manage Access Keys').'
');
}
+ 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,7 +741,7 @@ 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');
my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Creation Options','Create_Course',undef,'Create_Courses');
@@ -725,6 +750,10 @@ sub print_intro_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 +761,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,7 +769,7 @@ 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.'
@@ -748,7 +777,7 @@ sub print_intro_page {
{
linktext => 'Create courses/communities 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.'
@@ -758,7 +787,7 @@ sub print_intro_page {
{ categorytitle => 'Course/Community Requests',
items => [
{
- linktext => 'Approve or reject requests',
+ linktext => $approve,
url => '/adm/createcourse?phase=requestdisplay',
permission => $show_all_choices,
#help => '',
@@ -819,43 +848,60 @@ sub upload_batchfile {
sub process_batchfile {
my $r = shift;
- my $start_page =
- &Apache::loncommon::start_page('Create a New Course or Community');
- 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 $uname = $env{'user.name'};
+ my $udom = $env{'user.domain'};
+ my $dir = &LONCAPA::tempdir().'addcourse';
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;
+ 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\_$udom\E)/pending/([^/]+)$}) {
+ my ($batchdir,$filename) = ($1,$2);
+ if (-e "$batchfilepath") {
+ if (open(FILE,"<",$batchfilepath)) {
+ my @buffer = ;
close(FILE);
- if (-e "$batchdir/processed/$filename") {
- unlink("$batchdir/pending/$filename");
+ if ((defined($filename)) && (defined($batchdir))) {
+ my @requests = ($filename);
+ my %courseids = ();
+ ($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")) {
+ print FILE @buffer;
+ close(FILE);
+ }
+ }
+ 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($start_page.$crumbs.$logmsg.$result.''.
- &mt('Creation options menu').' '.$end_page);
-
+ $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());
}
sub courserequestbrowser_javascript {
@@ -1142,7 +1188,7 @@ sub creation_display_filter {
$typename = $typenames->{$type};
}
}
- $output .= ''.$typename.' '."\n";
+ $output .= ''.&mt($typename).' '."\n";
}
$output .= '';
}
@@ -1229,6 +1275,20 @@ 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);
+}
+
# ===================================================================== Handler
sub handler {
my $r = shift;
@@ -1239,14 +1299,27 @@ sub handler {
return OK;
}
- my $show_all_choices = 0;
- my $primary_rev = &Apache::lonnet::get_server_loncaparev($env{'request.role.domain'});
- 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 ($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;
+ }
+ }
+ }
- if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {
&Apache::loncommon::content_type($r,'text/html');
$r->send_http_header;
@@ -1257,9 +1330,10 @@ sub handler {
({href=>"/adm/createcourse",
text=>"Creation Options",
faq=>79,bug=>'Dom Coord Interface',});
- if (($env{'form.phase'} eq 'coursetwo') ||
- (($env{'form.phase'} eq 'grouptwo') &&
- ($show_all_choices))) {
+ if (($permission->{'create'}) &&
+ (($env{'form.phase'} eq 'coursetwo') ||
+ (($env{'form.phase'} eq 'grouptwo') &&
+ ($cancreate{'Community'})))) {
&Apache::lonhtmlcommon::add_breadcrumb
({href=>"/adm/createcourse?phase=$env{'form.prevphase'}",
text=>&mt('[_1] Creation Settings',),
@@ -1269,21 +1343,24 @@ sub handler {
text=>"Creation Outcome",
faq=>9,bug=>'Dom Coord Interface',});
&create_course($r);
- } elsif (($env{'form.phase'} eq 'courseone') ||
- (($env{'form.phase'} eq 'groupone') &&
- ($show_all_choices))) {
+ } elsif (($permission->{'create'}) &&
+ (($env{'form.phase'} eq 'courseone') ||
+ (($env{'form.phase'} eq 'groupone') &&
+ ($cancreate{'Community'})))) {
&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') {
+ } elsif (($permission->{'create'}) &&
+ ($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') {
+ } elsif (($permission->{'create'}) &&
+ ($env{'form.phase'} eq 'batchtwo')) {
&Apache::lonhtmlcommon::add_breadcrumb
({href=>"/adm/createcourse?phase=$env{'form.prevphase'}",
text=>"Upload Description File",
@@ -1300,12 +1377,17 @@ sub handler {
faq=>9,bug=>'Dom Coord Interface',});
my $js = &courserequestbrowser_javascript();
my $start_page=&Apache::loncommon::start_page('Display Requests',$js);
- my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Display Requests','Course_Request',undef,'Course_Request');
+ 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(
- 'domain',$env{'request.role.domain'}).'
'.
+ $context,$env{'request.role.domain'}).''.
&Apache::loncommon::end_page());
- } elsif (($env{'form.phase'} eq 'requestchange') && ($show_all_choices)) {
+ } elsif (($permission->{'create'}) &&
+ ($env{'form.phase'} eq 'requestchange') && ($show_all_choices)) {
if ($env{'form.queue'} eq 'pending') {
&Apache::lonhtmlcommon::add_breadcrumb
({href=>"/adm/createcourse?phase=pendingdisplay",
@@ -1322,7 +1404,7 @@ sub handler {
text=>&mt('[_1] Requests Updated',),
faq=>9,bug=>'Dom Coord Interface',},);
my $start_page=&Apache::loncommon::start_page('Update Requests Result');
- my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Requests Updated','Course_Request',undef,'Course_Request');
+ my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Requests Updated','Course_Requests',undef,'Course_Requests');
$r->print($start_page.$crumbs."\n".''.
&Apache::loncoursequeueadmin::update_request_queue(
'domain',$env{'request.role.domain'}).'
'.
@@ -1334,12 +1416,17 @@ sub handler {
faq=>9,bug=>'Dom Coord Interface',});
my $js = &courserequestbrowser_javascript();
my $start_page=&Apache::loncommon::start_page('Display Pending Queue',$js);
- my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Display Pending Queue','Course_Request',undef,'Course_Request');
+ 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(
- 'pending',$env{'request.role.domain'}).'
'.
+ $context,$env{'request.role.domain'}).''.
&Apache::loncommon::end_page());
- } elsif (($env{'form.phase'} eq 'requestvalidation') && ($show_all_choices)) {
+ } elsif (($permission->{'create'}) &&
+ ($env{'form.phase'} eq 'requestvalidation') && ($show_all_choices)) {
my $js = &courserequestbrowser_javascript();
&Apache::lonhtmlcommon::add_breadcrumb
({href=>"/adm/createcourse?phase=pendingdisplay",
@@ -1347,7 +1434,7 @@ sub handler {
{href=>"/adm/createcourse?phase=requestvalidation",
text=>&mt('Validation Attempted'),},);
my $start_page=&Apache::loncommon::start_page('Requests Validation Result',$js);
- my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Validation Attempted','Course_Request',undef,'Course_Request');
+ my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Validation Attempted','Course_Requests',undef,'Course_Requests');
$r->print($start_page.$crumbs."\n".''.
&Apache::loncoursequeueadmin::process_official_reqs('domain',$env{'request.role.domain'}).'
'.
&Apache::loncommon::end_page());
@@ -1361,12 +1448,12 @@ sub handler {
'// ]]>'."\n".
'';
my $start_page=&Apache::loncommon::start_page('Course/Community Creation Logs',$js);
- my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Created Courses/Communities','Creation_Log',undef,'Creation_Log');
+ my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Created Courses/Communities','Course_Creation_Log',undef,'Course_Creation_Log');
$r->print($start_page.$crumbs."\n".'');
&print_creation_logs($r);
$r->print('
'.&Apache::loncommon::end_page());
} else {
- &print_intro_page($r,$show_all_choices);
+ &print_intro_page($r,$show_all_choices,\%cancreate,$permission);
}
} else {
$env{'user.error.msg'}=