--- loncom/interface/loncreatecourse.pm	2016/08/25 22:33:03	1.163
+++ loncom/interface/loncreatecourse.pm	2017/11/12 23:04:23	1.169
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Create a course
 #
-# $Id: loncreatecourse.pm,v 1.163 2016/08/25 22:33:03 raeburn Exp $
+# $Id: loncreatecourse.pm,v 1.169 2017/11/12 23:04:23 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
 
@@ -106,7 +106,8 @@ sub print_course_creation_page {
         $course_home .= qq{>$server $host_servers{$server}</option>};
     }
     $course_home .= "\n</select>\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
@@ -773,7 +774,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');
@@ -782,6 +783,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',
@@ -789,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.'
@@ -797,7 +802,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.'
@@ -805,7 +810,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.'
@@ -813,7 +818,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.'
@@ -823,7 +828,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 => '',
@@ -884,42 +889,60 @@ 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 $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 = <FILE>;
-        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 = <FILE>;
                     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 = '<p class="LC_error">'.&mt('Could not open attributes file.').'<br />'.&mt('No courses created.').'</p>';
                 }
+            } else {
+                $result = '<p class="LC_error">'.&mt('No uploaded attributes file found.').'<br />'.&mt('No courses created.').'</p>';
             }
+        } else {
+            $result = '<p class="LC_error">'.&mt('Invalid path to attributes file.').'<br />'.&mt('No courses created.').'</p>';
         }
+    } else {
+        $result = '<p class="LC_error">'.&mt("Your username, domain, and/or your current role's domain are missing or contain invalid characters.").
+                  '<br />'.&mt('No courses created.').'</p>';
     }
-    $r->print($start_page.$crumbs.$logmsg.$result.'<br /><a href="/adm/createcourse">'.
-              &mt('Creation options menu').'</a>'.$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.'<br /><a href="/adm/createcourse">'.
+              &mt('Creation options menu').'</a>'.
+              &Apache::loncommon::end_page());
  
 }
 
@@ -1298,6 +1321,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;
@@ -1308,28 +1345,28 @@ 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;
+    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;
 
@@ -1340,11 +1377,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',),
@@ -1354,23 +1392,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",
@@ -1388,11 +1429,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".'<div>'.
                      &Apache::loncoursequeueadmin::display_queued_requests(
-                         'domain',$env{'request.role.domain'}).'</div>'.
+                         $context,$env{'request.role.domain'}).'</div>'.
                      &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",
@@ -1422,11 +1468,16 @@ sub handler {
            my $js = &courserequestbrowser_javascript();
            my $start_page=&Apache::loncommon::start_page('Display Pending Queue',$js);
            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".'<div>'.
                      &Apache::loncoursequeueadmin::display_queued_requests(
-                         'pending',$env{'request.role.domain'}).'</div>'.
+                         $context,$env{'request.role.domain'}).'</div>'.
                      &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",
@@ -1453,7 +1504,7 @@ sub handler {
            &print_creation_logs($r);
            $r->print('</div>'.&Apache::loncommon::end_page());
        } else {
-           &print_intro_page($r,$show_all_choices,\%cancreate);
+           &print_intro_page($r,$show_all_choices,\%cancreate,$permission);
        }
    } else {
       $env{'user.error.msg'}=