--- loncom/interface/loncreatecourse.pm	2020/07/20 10:37:41	1.158.2.7.2.1
+++ loncom/interface/loncreatecourse.pm	2016/04/04 01:09:48	1.159
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Create a course
 #
-# $Id: loncreatecourse.pm,v 1.158.2.7.2.1 2020/07/20 10:37:41 raeburn Exp $
+# $Id: loncreatecourse.pm,v 1.159 2016/04/04 01:09:48 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -80,12 +80,9 @@ use Apache::loncommon;
 use Apache::londocs;
 use Apache::lonlocal;
 use Apache::lonuserutils;
+use Apache::lonclonecourse;
 use LONCAPA::batchcreatecourse;
-use LONCAPA qw(:DEFAULT :match);
-
-my $registered_flush;
-my $registered_instcats;
-my $modified_dom;
+use LONCAPA;
 
 # ===================================================== Phase one: fill-in form
 
@@ -94,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);
@@ -102,7 +101,7 @@ sub print_course_creation_page {
     foreach my $server (sort(keys(%host_servers))) {
         $course_home .= qq{<option value="$server"};
         if ($server eq $Apache::lonnet::perlvar{'lonHostID'}) {
-            $course_home .= ' selected="selected"';
+            $course_home .= " selected ";
         }
         $course_home .= qq{>$server $host_servers{$server}</option>};
     }
@@ -119,8 +118,6 @@ 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');
-    my $openallfrom =
-        &Apache::lonhtmlcommon::date_setter('ccrs','openallfrom',$starttime);
     if ($crstype eq 'Course') {
         $enroll_table = &Apache::lonuserutils::date_setting_table($starttime,
                                               $endtime,'create_enrolldates');
@@ -135,7 +132,7 @@ sub print_course_creation_page {
         $krbform = &Apache::loncommon::authform_kerberos(%param);
         $intform = &Apache::loncommon::authform_internal(%param);
         $locform = &Apache::loncommon::authform_local(%param);
-    } else {
+    } elsif ($crstype eq 'Community') {
         my $title_alert = &mt('A Community title is required');
         my $coord_alert = &mt('The username of the Coordinator is required');
         &js_escape(\$title_alert);
@@ -152,6 +149,24 @@ 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",
@@ -188,17 +203,11 @@ 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",
-                    'sta'  => "starting from:",
                     'mssg' => "Messaging",
                     'scpf' => "Set course policy feedback to Course Coordinator",
-                    'scfc' => "Set resource content feedback to Course Coordinator",
-                    'scof' => "Set course content feedback to Course Coordinator",
+                    'scfc' => "Set content feedback to Course Coordinator",
                     'cmmn' => "Communication",
                     'dsrd' => "Disable student resource discussion",
                     'dsuc' => "Disable student use of chat rooms",
@@ -244,8 +253,7 @@ 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 resource content feedback to Coordinator');
-        $lt{'scof'} = &mt('Set community content feedback to Coordinator');
+        $lt{'scfc'} = &mt('Set 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');
@@ -256,13 +264,21 @@ 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 = <<END;
 <script type="text/javascript">
-// <![CDATA[
-
 var editbrowser = null;
 function openbrowser(formname,elementname) {
     var url = '/res/?';
@@ -281,8 +297,6 @@ function openbrowser(formname,elementnam
     editbrowser.focus();
 }
 $javascript_validations
-
-// ]]>
 </script>
 $coursebrowserjs
 END
@@ -290,6 +304,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);
@@ -301,7 +316,7 @@ END
 					    'Create_Courses');
     $r->print($start_page.$crumbs);
 
-    $r->print('<form action="/adm/createcourse" method="post" name="ccrs"><div class="LC_createcourse">'
+    $r->print('<form action="/adm/createcourse" method="post" name="ccrs" action=""><div class="LC_createcourse">'
              .&Apache::lonhtmlcommon::start_pick_box()
 
              .&Apache::lonhtmlcommon::row_headline()
@@ -368,9 +383,12 @@ END
                      .'<span class="LC_nobreak">'
                      .'<input type="radio" name="uniquecode" value="1" />'.&mt('Yes').('&nbsp;'x2)
                      .'<input type="radio" name="uniquecode" value="0" checked="checked" />'.&mt('No')
-                     .'</span>'
                      .&Apache::lonhtmlcommon::row_closure()
-            );
+                 );
+    }
+    my $blankchk;
+    if ($crstype eq 'Placement') {
+        $blankchk = ' checked="checked"';
     }
     # Table: New Course / Clone Course
     $r->print(&Apache::lonhtmlcommon::row_headline()
@@ -396,15 +414,14 @@ END
                  .&Apache::lonhtmlcommon::row_closure()
                  .&Apache::lonhtmlcommon::row_title($lt{'fres'})
                  .'<label>'
-                 .'<input type="radio" name="firstres" value="blank" />'.$lt{'blnk'}
-                 .'</label>'
-                 .'&nbsp;');
+                 .'<input type="radio" name="firstres" value="blank"'.$blankchk.' />'.$lt{'blnk'}
+                 .'</label>');
     if ($crstype eq 'Community') {
-        $r->print('<label>'
+        $r->print('&nbsp;<label>'
                  .'<input type="radio" name="firstres" value="nav" checked="checked" />'.$lt{'navi'}
                  .'</label>');
-    } else {
-        $r->print('<label>'
+    } elsif ($crstype eq 'Course') {
+        $r->print('&nbsp;<label>'
                  .'<input type="radio" name="firstres" value="syl" checked="checked" />'.$lt{'sllb'}
                  .'</label>'
                  .'&nbsp;'
@@ -412,12 +429,11 @@ END
                  .'<input type="radio" name="firstres" value="nav" />'.$lt{'navi'}
                  .'</label>');
     }
-    my $tinyurlhelp=&Apache::loncommon::help_open_topic('Clone_Tiny_URLs');
     $r->print('<br />('.$lt{'stco'}.')'
                  .&Apache::lonhtmlcommon::row_closure(1)
                  .&Apache::lonhtmlcommon::end_pick_box()
 
-                 .'</td><td>&nbsp;</td>'
+                 .'<td>&nbsp;</td>'
 
                  # Clone Course:
                  .'<td>'
@@ -444,17 +460,6 @@ END
                  .'</label>'
                  .' <input type="text" size="5" name="dateshift" value="365" />'
                  .&Apache::lonhtmlcommon::row_closure()
-                 .&Apache::lonhtmlcommon::row_title($tinyurlhelp.$lt{'dpl'})
-                 .'<label>'
-                 .'<input type="radio" name="tinyurls" value="delete" /> '.$lt{'nsl'}
-                 .'</label><br />'
-                 .'<label>'
-                 .'<input type="radio" name="tinyurls" value="transfer" /> '.$lt{'tsl'}
-                 .'</label><br />'
-                 .'<label>'
-                 .'<input type="radio" name="tinyurls" value="create" checked="checked" /> '.$lt{'csl'}
-                 .'</label>'
-                 .&Apache::lonhtmlcommon::row_closure()
                  .&Apache::lonhtmlcommon::row_headline()
                  .'<span class="LC_info">'.$lt{'asov'}.'</span>'
                  .&Apache::lonhtmlcommon::row_closure(1)
@@ -478,10 +483,7 @@ END
                  .&Apache::lonhtmlcommon::row_closure()
 
                  .&Apache::lonhtmlcommon::row_title($lt{'oaas'})
-                 .'<span class="LC_nobreak">'
-                 .'<label><input type="radio" name="openall" value="0" checked="checked" />'.$lt{'no'}.'</label>'.('&nbsp;'x2)
-                 .'<label><input type="radio" name="openall" value="1" />'.$lt{'yes'}.'</label>'.',&nbsp;'
-                 .$lt{'sta'}.'&nbsp;'.$openallfrom.'</span>'
+                 .'<input type="checkbox" name="openall" />'
                  .&Apache::lonhtmlcommon::row_closure()
 
                  .&Apache::lonhtmlcommon::row_headline()
@@ -496,10 +498,6 @@ END
                  .'<input type="checkbox" name="setcontent" checked="checked" />'
                  .&Apache::lonhtmlcommon::row_closure()
 
-                 .&Apache::lonhtmlcommon::row_title($lt{'scof'})
-                 .'<input type="checkbox" name="setcomment" checked="checked" />'
-                 .&Apache::lonhtmlcommon::row_closure()
-
                  .&Apache::lonhtmlcommon::row_headline()
                  .'<h3>'.$lt{'cmmn'}.'</h3>'
                  .&Apache::lonhtmlcommon::row_closure()
@@ -595,8 +593,7 @@ END
 <p>
 <input type="hidden" name="prevphase" value="courseone" />
 <input type="hidden" name="phase" value="coursetwo" />
-<input type="button" onclick="verify_message(this.form)" value="'.$lt{'opco'}.'" />
-</p>'
+<input type="button" onclick="verify_message(this.form)" value="'.$lt{'opco'}.'" />'
         );
     } elsif ($crstype eq 'Community') {
         $r->print('
@@ -606,6 +603,14 @@ END
 <input type="submit" value="'.$lt{'opcm'}.'" />
 </p>'
         );
+    } elsif ($crstype eq 'Placement') {
+        $r->print('
+<p>
+<input type="hidden" name="prevphase" value="placementone" />
+<input type="hidden" name="phase" value="placementtwo" />
+<input type="submit" value="'.$lt{'opcm'}.'" />
+</p>'
+        );
     }
     $r->print('</form>'.
               $end_page);
@@ -618,7 +623,7 @@ sub create_course {
     my $ccuname =&LONCAPA::clean_username($env{'form.ccuname'});
     my $ccdomain=&LONCAPA::clean_domain($env{'form.ccdomain'});
     my $crstype = 'Community';
-    my ($enrollstart,$enrollend,$startaccess,$endaccess,$openallfrom);
+    my ($enrollstart,$enrollend,$startaccess,$endaccess);
     my %domdefaults = 
         &Apache::lonnet::get_domain_defaults($env{'request.role.domain'});
 
@@ -626,10 +631,11 @@ 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');
-    $openallfrom = &Apache::lonhtmlcommon::get_date_from_form('openallfrom');
 
     my $autharg;
     my $authtype;
@@ -670,7 +676,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'},
@@ -689,14 +694,12 @@ 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'},
                disresdis => $env{'form.disresdis'},
                disablechat => $env{'form.disablechat'},
                openall => $env{'form.openall'},
-               openallfrom => $openallfrom,
                firstres => $env{'form.firstres'}
                };
 
@@ -738,20 +741,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}}).'<br />'."\n");
-            }
-        }
-    }
     if ($success) {
         #
 	# Make the requested user a course coordinator or group coordinator
@@ -775,10 +770,8 @@ sub create_course {
                       '<p>'.&mt('Course identifier to share with students: [_1]',$code).'</p>'
                      );
         }
-        if ($env{'form.crscode'} ne '') {
-            &Apache::lonnet::devalidate_cache_new('instcats',$crsudom);
-        }
-        &register_cleanups($r,$crsudom,$env{'form.crscode'});
+        # Flush the course logs so reverse user roles immediately updated
+	$r->register_cleanup(\&Apache::lonnet::flushcourselogs);
 	$r->print('<p>'.&mt('Roles will be active at next login').'.</p>');
     }
     $r->print('<p><a href="/adm/createcourse?phase='.lc($crstype).'one">'.
@@ -787,19 +780,15 @@ sub create_course {
 }
 
 sub print_intro_page {
-    my ($r,$show_all_choices,$cancreate,$permission) = @_;
+    my ($r,$show_all_choices,$cancreate) = @_;
     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',
@@ -807,7 +796,7 @@ sub print_intro_page {
           {
                linktext => 'Create a single course',
                url => '/adm/createcourse?phase=courseone',
-               permission => $permission->{'create'},
+               permission => 1,
                #help => '',
                icon => 'crsnew.png',
                linktitle => 'Create a new course by completing an online form.'
@@ -815,30 +804,38 @@ sub print_intro_page {
           {
                linktext => 'Create a single community',
                url => '/adm/createcourse?phase=groupone',
-               permission => $permission->{'create'} && $cancreate->{'Community'},
+               permission => $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 => $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'},
+               permission => 1,
                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,
+               linktext => 'Approve or reject requests',
                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',
@@ -859,7 +856,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.'
            },
        ]
        },
@@ -876,88 +873,61 @@ 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('<h3>'.&mt('Upload a courses or communities attributes file').'</h3>');
+    $r->print('<h3>'.&mt('Upload a courses, communities or placement tests attributes file').'</h3>');
     $r->print('<form name="batchcreate" method="post" '.
                 'enctype="multipart/form-data" action="/adm/createcourse">'.
               '<input type="file" name="coursecreatorxml" />'.
               '<input type="hidden" name="phase" value="batchtwo" /><br /><br />'.
               '<input type="submit" name="batchsubmit" '.
-              'value="'.&mt('Create Courses/Communities').'" /></form>');
+              'value="'.&mt('Create Courses/Communities/Placement Tests').'" /></form>');
     $r->print($end_page);
     return;
 }
 
 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 $uname = $env{'user.name'};
-    my $udom = $env{'user.domain'};
-    my $dir = &LONCAPA::tempdir().'addcourse';
-    my ($result,$logmsg,$clonemsg,$keysmsg,$codesref,$instcodesref);
-    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\E_\Q$udom\E)/pending/([^/]+)$}) {
-            my ($batchdir,$filename) = ($1,$2);
-            if (-e "$batchfilepath") {
-                if (open(FILE,"<",$batchfilepath)) {
-                    my @buffer = <FILE>;
+    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 = <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;
                     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);
-                        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");
-                            }
-                            my $updatecats;
-                            if ((ref($instcodesref) eq 'HASH') && (keys(%{$instcodesref}) > 0)) {
-                                &Apache::lonnet::devalidate_cache_new('instcats',$defdom);
-                                $updatecats = 1;
-                            }
-                            &register_cleanups($r,$defdom,$updatecats);
-                        }
-                        if ($clonemsg) {
-                            $clonemsg = '<p class="LC_info">'.$clonemsg.'</p>'."\n";
-                        }
+                    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(&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.'<br /><a href="/adm/createcourse">'.
-              &mt('Creation options menu').'</a>'.
-              &Apache::loncommon::end_page());
+    $r->print($start_page.$crumbs.$logmsg.$result.'<br /><a href="/adm/createcourse">'.
+              &mt('Creation options menu').'</a>'.$end_page);
+ 
 }
 
 sub courserequestbrowser_javascript {
@@ -1041,6 +1011,8 @@ sub print_creation_logs {
         $crstype = '.';
     } elsif ($curr{'type'} eq 'community') {
         $crstype = 'Community';
+    } elsif ($curr{'type'} eq 'placement') {
+        $crstype = 'Placement';
     }
 
     my ($instcodefilter,$regexpok);
@@ -1131,6 +1103,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 '')  {
@@ -1331,58 +1305,6 @@ 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;
@@ -1393,31 +1315,29 @@ sub handler {
        return OK;
     }
 
-    $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,
-                        );
-        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 $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;
             }
         }
+    }
+print STDERR "cacreate Community $cancreate{'Community'} cancreate Placement $cancreate{'Placement'}\n";
 
+    if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {
        &Apache::loncommon::content_type($r,'text/html');
        $r->send_http_header;
 
@@ -1428,10 +1348,11 @@ sub handler {
           ({href=>"/adm/createcourse",
             text=>"Creation Options",
             faq=>79,bug=>'Dom Coord Interface',});
-       if (($permission->{'create'}) &&
-           (($env{'form.phase'} eq 'coursetwo') ||
-            (($env{'form.phase'} eq 'grouptwo') &&
-            ($cancreate{'Community'})))) {
+       if (($env{'form.phase'} eq 'coursetwo') ||
+           (($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',),
@@ -1441,24 +1362,23 @@ sub handler {
                    text=>"Creation Outcome",
                    faq=>9,bug=>'Dom Coord Interface',});
            &create_course($r);
-       } elsif (($permission->{'create'}) &&
-                (($env{'form.phase'} eq 'courseone') ||
-                 (($env{'form.phase'} eq 'groupone') &&
-                 ($cancreate{'Community'})))) {
+       } elsif (($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 (($permission->{'create'}) &&
-                ($env{'form.phase'} eq 'batchone')) {
+       } elsif ($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 (($permission->{'create'}) &&
-                ($env{'form.phase'} eq 'batchtwo')) {
+       } elsif ($env{'form.phase'} eq 'batchtwo') {
            &Apache::lonhtmlcommon::add_breadcrumb
                  ({href=>"/adm/createcourse?phase=$env{'form.prevphase'}",
                    text=>"Upload Description File",
@@ -1476,16 +1396,11 @@ 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(
-                         $context,$env{'request.role.domain'}).'</div>'.
+                         'domain',$env{'request.role.domain'}).'</div>'.
                      &Apache::loncommon::end_page());
-       } elsif (($permission->{'create'}) &&
-                ($env{'form.phase'} eq 'requestchange') && ($show_all_choices)) { 
+       } elsif (($env{'form.phase'} eq 'requestchange') && ($show_all_choices)) {
            if ($env{'form.queue'} eq 'pending') {
                &Apache::lonhtmlcommon::add_breadcrumb
                    ({href=>"/adm/createcourse?phase=pendingdisplay",
@@ -1515,16 +1430,11 @@ 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(
-                         $context,$env{'request.role.domain'}).'</div>'.
+                         'pending',$env{'request.role.domain'}).'</div>'.
                      &Apache::loncommon::end_page());
-       } elsif (($permission->{'create'}) &&
-                ($env{'form.phase'} eq 'requestvalidation') && ($show_all_choices)) { 
+       } elsif (($env{'form.phase'} eq 'requestvalidation') && ($show_all_choices)) {
            my $js = &courserequestbrowser_javascript();
            &Apache::lonhtmlcommon::add_breadcrumb
                  ({href=>"/adm/createcourse?phase=pendingdisplay",
@@ -1534,9 +1444,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".'<div>'.
-                     &Apache::loncoursequeueadmin::process_official_reqs('domain',$env{'request.role.domain'},
-                                                                         $env{'user.name'},$env{'user.domain'}).
-                     '</div>'.
+                     &Apache::loncoursequeueadmin::process_official_reqs('domain',$env{'request.role.domain'}).'</div>'.
                      &Apache::loncommon::end_page());
        } elsif (($env{'form.phase'} eq 'creationlog') && ($show_all_choices)) {
            &Apache::lonhtmlcommon::add_breadcrumb
@@ -1553,7 +1461,7 @@ sub handler {
            &print_creation_logs($r);
            $r->print('</div>'.&Apache::loncommon::end_page());
        } else {
-           &print_intro_page($r,$show_all_choices,\%cancreate,$permission);
+           &print_intro_page($r,$show_all_choices,\%cancreate);
        }
    } else {
       $env{'user.error.msg'}=