'.
&mt('Your request has been placed in a queue pending administrative action.').' '.
&mt("Usually this means that your institution's information systems do not list you among the instructional personnel for this course.").' '.
&mt('The list of instructional personnel for the course will be automatically checked daily, and once you are listed the request will be processed.').
- '
';
+ '
';
+ if (ref($postprocess) eq 'HASH') {
+ if ($postprocess->{'pendingweb'}) {
+ $output .= $postprocess->{'pendingweb'};
+ } else {
+ $output .= $pending_default;
+ }
+ } else {
+ $output .= $pending_default;
+ }
} elsif ($disposition eq 'created') {
if (($code) || ((ref($postprocess) eq 'HASH') &&
((ref($postprocess->{'createdmsg'}) eq 'ARRAY') || ($postprocess->{'createdweb'})))) {
@@ -4058,6 +4307,56 @@ sub notification_information {
return $output;
}
+sub pending_validation_form {
+ my ($r,$cdom,$cnum,$crstype,$now,$token,$lonhost,$cdesc) = @_;
+ my $output;
+ my %postvalues = (
+ 'owner' => $env{'user.name'}.':'.$env{'user.domain'},
+ 'course' => $cdom.'_'.$cnum,
+ 'coursetype' => $crstype,
+ );
+ my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$cdom);
+
+ if (ref($domconfig{'requestcourses'}) eq 'HASH') {
+ my ($url,$buttontext,$code,@fields);
+ if (ref($domconfig{'requestcourses'}{'validation'}) eq 'HASH') {
+ $postvalues{'description'} = $cdesc;
+ $url = $domconfig{'requestcourses'}{'validation'}{'url'};
+ if (ref($domconfig{'requestcourses'}{'validation'}{'fields'}) eq 'ARRAY') {
+ @fields = @{$domconfig{'requestcourses'}{'validation'}{'fields'}};
+ }
+ $buttontext = $domconfig{'requestcourses'}{'validation'}{'button'};
+ $output .= $domconfig{'requestcourses'}{'validation'}{'markup'};
+ if (($url =~ m{^(https?\://|/)}) && (@fields > 0)) {
+ $output .= ''."\n";
+ }
+ }
+ }
+ return $output;
+}
+
sub check_autolimit {
my ($uname,$udom,$dom,$crstype,$limit,$message) = @_;
my %crsroles = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},
@@ -4275,25 +4574,26 @@ sub generate_date_items {
sub print_textbook_form {
my ($r,$dom,$incdoms,$domdefs,$settings,$can_request) = @_;
- my ($bookshash,%ordered);
+ my (%prefab,%ordered,%numprefab);
my $crstype = 'textbook';
#
-# Retrieve list of textbook courses cloneable by user
+# Retrieve list of prefabricated courses (textbook courses and templates) cloneable by user
#
- my $numbook;
- if (ref($settings) eq 'HASH') {
- $bookshash = $settings->{'textbooks'};
- if (ref($bookshash) eq 'HASH') {
- foreach my $item (keys(%{$bookshash})) {
- my ($clonedom,$clonecrs) = split(/_/,$item);
- if (ref($bookshash->{$item}) eq 'HASH') {
+ foreach my $type ('textbooks','templates') {
+ $numprefab{$type} = 0;
+ if (ref($settings) eq 'HASH') {
+ $prefab{$type} = $settings->{$type};
+ if (ref($prefab{$type}) eq 'HASH') {
+ foreach my $item (keys(%{$prefab{$type}})) {
my ($clonedom,$clonecrs) = split(/_/,$item);
- if (&Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},
- $env{'user.domain'},$clonecrs,$clonedom,$crstype)) {
-
- my $num = $bookshash->{$item}{'order'};
- $ordered{$num} = $item;
- $numbook ++;
+ if (ref($prefab{$type}{$item}) eq 'HASH') {
+ if (&Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},
+ $env{'user.domain'},$clonecrs,$clonedom,$crstype,$dom)) {
+
+ my $num = $prefab{$type}{$item}{'order'};
+ $ordered{$type}{$num} = $item;
+ $numprefab{$type} ++;
+ }
}
}
}
@@ -4311,27 +4611,89 @@ sub print_textbook_form {
}
#
-# Retrieve information about courses owned by user, or in which user has an active or future
-# Course Coordinator role
+# Retrieve information about courses owned by user, or in which user has an active
+# Course Coordinator role
#
my $numcurrent;
my %cloneable = &Apache::lonnet::courseiddump($dom,'.',1,'.',$env{'user.name'}.':'.$env{'user.domain'},
- undef,undef,undef,'Course');
+ '.',undef,undef,'Course');
my %ccroles = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},'userroles',
- ['active','future'],['cc']);
+ ['active'],['cc']);
+
+ my $cc_clone = '';
foreach my $role (keys(%ccroles)) {
my ($cnum,$cdom,$rest) = split(/:/,$role,3);
+ $cc_clone .= $cdom.':'.$cnum.'&';
unless (exists($cloneable{$cdom.'_'.$cnum})) {
my %courseinfo = &Apache::lonnet::coursedescription($cdom.'_'.$cnum,{'one_time' => 1});
- $cloneable{$cdom.'_'.$cnum} = \%courseinfo;
+ $cloneable{$cdom.'_'.$cnum} = {
+ context => $courseinfo{'internal.creationcontext'},
+ created => $courseinfo{'internal.created'},
+ creator => $courseinfo{'internal.creator'},
+ description => $courseinfo{'description'},
+ inst_code => $courseinfo{'coursecode'},
+ owner => $courseinfo{'internal.courseowner'},
+ releaserequired => $courseinfo{'internal.releaserequired'},
+ type => $courseinfo{'type'},
+ };
}
}
my $numcurrent = scalar(keys(%cloneable));
- my $jscript = &textbook_request_javascript($numbook,$numcurrent);
+#
+# Retrieve information about courses from user's domain which user can clone, but which not owned
+# or cloneable based on Course Coordinator role.
+#
+ my ($numdomcourses,%domcloneable);
+ my %allcloneable = &Apache::lonnet::courseiddump($dom,'.',1,'.','.','.',undef,undef,'Course',
+ undef,undef,undef,undef,undef,
+ $env{'user.name'}.':'.$env{'user.domain'},
+ $cc_clone,1);
+ foreach my $cid (keys(%allcloneable)) {
+ unless (exists($cloneable{$cid})) {
+ $domcloneable{$cid} = $allcloneable{$cid};
+ }
+ }
+ $numdomcourses = scalar(keys(%domcloneable));
+
+ my $fullname = &Apache::loncommon::plainname($env{'user.name'},
+ $env{'user.domain'});
+
+#
+# Retrieve any custom form information prior to rendering page
+#
+
+ my $initprocess = &Apache::lonnet::auto_crsreq_update($dom,undef,$crstype,'initializereview',$env{'user.name'},
+ $env{'user.domain'},$fullname);
+ my %custominit;
+ if (ref($initprocess) eq 'HASH') {
+ &custom_formitems($initprocess,\%custominit);
+ }
+
+#
+# Retrieve any custom onload actions or javascript used for page before rendering
+#
+
+ my ($customonload,$customjs,$customvalidationjs);
+ my $inprocess = &Apache::lonnet::auto_crsreq_update($dom,undef,$crstype,'prereview',$env{'user.name'},
+ $env{'user.domain'},$fullname,undef,undef,
+ undef,undef,\%custominit);
+ if (ref($inprocess) eq 'HASH') {
+ $customonload = $inprocess->{'onload'};
+ $customjs = $inprocess->{'javascript'};
+ $customvalidationjs = $inprocess->{'validationjs'};
+ }
+
+ my $postprocess = &Apache::lonnet::auto_crsreq_update($dom,undef,$crstype,'review',
+ $env{'user.name'},
+ $env{'user.domain'},$fullname,undef,undef,
+ undef,undef,\%custominit);
+
+ my $jscript = &textbook_request_javascript(\%numprefab,$numcurrent,$numdomcourses,$customvalidationjs);
+ $jscript .= $customjs;
my %loaditems;
- $loaditems{'onload'} = 'javascript:uncheckAllRadio();';
+ $loaditems{'onload'} = 'javascript:uncheckAllRadio();'.$customonload;
$r->print(&header('Course Request',$jscript,\%loaditems));
if (ref($can_request) eq 'HASH') {
@@ -4376,19 +4738,31 @@ sub print_textbook_form {
#
# Content source selection, if more than one available
#
- if (keys(%cloneable) || keys(%ordered)) {
+ if (keys(%cloneable) || keys(%ordered) || keys(%domcloneable)) {
$r->print('
'.
'
');
+ }
+#
+# Table of other cloneable courses from user's domain (exclude own courses)
+#
+ if (keys(%domcloneable)) {
+ $r->print('