--- loncom/interface/loncreatecourse.pm 2016/04/06 17:41:52 1.161 +++ loncom/interface/loncreatecourse.pm 2019/07/25 20:23:52 1.171 @@ -1,7 +1,7 @@ # The LearningOnline Network # Create a course # -# $Id: loncreatecourse.pm,v 1.161 2016/04/06 17:41:52 raeburn Exp $ +# $Id: loncreatecourse.pm,v 1.171 2019/07/25 20:23:52 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -82,7 +82,11 @@ use Apache::lonlocal; use Apache::lonuserutils; use Apache::lonclonecourse; use LONCAPA::batchcreatecourse; -use LONCAPA; +use LONCAPA qw(:DEFAULT :match); + +my $registered_flush; +my $registered_instcats; +my $modified_dom; # ===================================================== Phase one: fill-in form @@ -106,7 +110,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 @@ -118,7 +123,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) = @@ -132,7 +137,7 @@ sub print_course_creation_page { $krbform = &Apache::loncommon::authform_kerberos(%param); $intform = &Apache::loncommon::authform_internal(%param); $locform = &Apache::loncommon::authform_local(%param); - } elsif ($crstype eq 'Community') { + } 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); @@ -149,24 +154,6 @@ function validate(formname) { formname.submit(); } |; - } else { - my $title_alert = &mt('A Placement Test title is required'); - my $coord_alert = &mt('The username of the Course Coordinator is required'); - &js_escape(\$title_alert); - &js_escape(\$coord_alert); - $javascript_validations = qq| -function validate(formname) { - if (formname.title == '') { - alert("$title_alert"); - return; - } - if (formname.ccuname == '') { - alert("$coord_alert"); - } - formname.submit(); -} - |; - } my %lt=&Apache::lonlocal::texthash( 'cinf' => "Course Information", @@ -207,7 +194,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", @@ -254,7 +242,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'); @@ -502,6 +491,10 @@ END .'' .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title($lt{'scof'}) + .'' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_headline() .'
- +
' ); } @@ -698,6 +691,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'}, @@ -774,8 +768,10 @@ sub create_course { ''.&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); + if ($env{'form.crscode'} ne '') { + &Apache::lonnet::devalidate_cache_new('instcats',$crsudom); + } + ®ister_cleanups($r,$crsudom,$env{'form.crscode'}); $r->print(''.&mt('Roles will be active at next login').'.
'); } $r->print(''.
@@ -784,7 +780,7 @@ sub create_course {
}
sub print_intro_page {
- my ($r,$show_all_choices,$cancreate) = @_;
+ my ($r,$show_all_choices,$cancreate,$permission) = @_;
my $start_page =
&Apache::loncommon::start_page('Create a New Course, Community or Placement Test');
my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Creation Options','Create_Course',undef,'Create_Courses');
@@ -793,6 +789,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',
@@ -800,7 +800,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.'
@@ -808,7 +808,7 @@ sub print_intro_page {
{
linktext => 'Create a single community',
url => '/adm/createcourse?phase=groupone',
- permission => $cancreate->{'Community'},
+ permission => $permission->{'create'} && $cancreate->{'Community'},
#help => '',
icon => 'crsnew.png',
linktitle => 'Create a new collaborative community by completing an online form.'
@@ -816,7 +816,7 @@ sub print_intro_page {
{
linktext => 'Create a single placement test',
url => '/adm/createcourse?phase=placementone',
- permission => $cancreate->{'Placement'},
+ permission => $permission->{'create'} && $cancreate->{'Placement'},
#help => '',
icon => 'crsnew.png',
linktitle => 'Create a new placement test by completing an online form.'
@@ -824,7 +824,7 @@ sub print_intro_page {
{
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, communities or placement tests in XML format.'
@@ -834,7 +834,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 => '',
@@ -895,42 +895,66 @@ sub upload_batchfile {
sub process_batchfile {
my $r = shift;
- my $start_page =
- &Apache::loncommon::start_page('Create a New Course, Community or Placement Test');
- 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 = '.&mt('Could not open attributes file.').' '.&mt('No uploaded attributes file found.').' '.&mt('Invalid path to attributes file.').' '.&mt("Your username, domain, and/or your current role's domain are missing or contain invalid characters.").
+ '
'.&mt('No courses created.').'
'.&mt('No courses created.').'
'.&mt('No courses created.').'
'.&mt('No courses created.').'
'.
- &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());
}
@@ -1309,6 +1333,58 @@ 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);
+}
+
+sub register_cleanups {
+ my ($r,$cdom,$updatecats) = @_;
+ # Flush the course logs so reverse user roles immediately updated
+ unless ($registered_flush) {
+ my $handlers = $r->get_handlers('PerlCleanupHandler');
+ $r->set_handlers('PerlCleanupHandler' => [\&Apache::lonnet::flushcourselogs,@{$handlers}]);
+ $registered_flush=1;
+ }
+ # Update cache of self-cataloging courses on institution's server(s).
+ if ($updatecats) {
+ if (&Apache::lonnet::shared_institution($cdom)) {
+ unless ($registered_instcats) {
+ my $handlers = $r->get_handlers('PerlCleanupHandler');
+ $r->set_handlers('PerlCleanupHandler' => [\&devalidate_remote_instcats,@{$handlers}]);
+ $registered_instcats=1;
+ $modified_dom = $cdom;
+ }
+ }
+ }
+ return;
+}
+
+sub devalidate_remote_instcats {
+ if ($modified_dom ne '') {
+ my %servers = &Apache::lonnet::internet_dom_servers($modified_dom);
+ my %thismachine;
+ map { $thismachine{$_} = 1; } &Apache::lonnet::current_machine_ids();
+ if (keys(%servers)) {
+ foreach my $server (keys(%servers)) {
+ next if ($thismachine{$server});
+ &Apache::lonnet::remote_devalidate_cache($server,['instcats:'.$modified_dom]);
+ }
+ }
+ $modified_dom = '';
+ }
+ return;
+}
+
# ===================================================================== Handler
sub handler {
my $r = shift;
@@ -1319,28 +1395,32 @@ sub handler {
return OK;
}
- my $show_all_choices = 0;
- 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) =
- split(/\./,$Apache::lonnet::needsrelease{'course:crstype:'.$key});
- unless (($needsmajor > $primary_major) ||
- (($needsmajor == $primary_major) && ($needsminor > $primary_minor))) {
- $cancreate{$key} = 1;
+ $registered_flush = 0;
+ $registered_instcats = 0;
+ $modified_dom = '';
+
+ 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,
+ 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) =
+ 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;
@@ -1351,11 +1431,12 @@ 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') &&
+ if (($permission->{'create'}) &&
+ (($env{'form.phase'} eq 'coursetwo') ||
+ (($env{'form.phase'} eq 'grouptwo') &&
($cancreate{'Community'})) ||
(($env{'form.phase'} eq 'placementtwo') &&
- ($cancreate{'Placement'}))) {
+ ($cancreate{'Placement'})))) {
&Apache::lonhtmlcommon::add_breadcrumb
({href=>"/adm/createcourse?phase=$env{'form.prevphase'}",
text=>&mt('[_1] Creation Settings',),
@@ -1365,23 +1446,26 @@ 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') &&
- ($cancreate{'Community'})) ||
- (($env{'form.phase'} eq 'placementone') &&
- ($cancreate{'Placement'}))) {
+ } elsif (($permission->{'create'}) &&
+ (($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',),
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",
@@ -1399,11 +1483,16 @@ sub handler {
my $js = &courserequestbrowser_javascript();
my $start_page=&Apache::loncommon::start_page('Display Requests',$js);
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".'