version 1.75, 2014/01/05 10:55:35
|
version 1.118, 2025/01/10 22:45:55
|
Line 119 use Apache::loncoursequeueadmin;
|
Line 119 use Apache::loncoursequeueadmin;
|
use Apache::lonuserutils; |
use Apache::lonuserutils; |
use LONCAPA qw(:DEFAULT :match); |
use LONCAPA qw(:DEFAULT :match); |
|
|
|
my $registered_flush; |
|
my $registered_instcats; |
|
my $modified_dom; |
|
|
sub handler { |
sub handler { |
my ($r) = @_; |
my ($r) = @_; |
&Apache::loncommon::content_type($r,'text/html'); |
&Apache::loncommon::content_type($r,'text/html'); |
Line 127 sub handler {
|
Line 131 sub handler {
|
return OK; |
return OK; |
} |
} |
|
|
|
$registered_flush = 0; |
|
$registered_instcats = 0; |
|
$modified_dom = ''; |
|
|
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
['action','showdom','cnum','state','crstype','queue','tabs']); |
['action','showdom','cnum','state','crstype','queue','tabs']); |
&Apache::lonhtmlcommon::clear_breadcrumbs(); |
&Apache::lonhtmlcommon::clear_breadcrumbs(); |
Line 155 sub handler {
|
Line 163 sub handler {
|
} |
} |
|
|
if ($canreq) { |
if ($canreq) { |
|
if (($env{'form.crstype'} eq 'lti') && ($env{'request.lti.login'}) && |
|
($env{'form.lti.reqrole'} eq 'cc') && ($env{'form.lti.reqcrs'}) && |
|
($env{'form.lti.sourcecrs'} ne '')) { |
|
if ($action eq 'process') { |
|
if ($can_request{'lti'}) { |
|
my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom); |
|
&process_textbook_request($r,$dom,$action,\%domdefs,\%domconfig,\%can_request,'lti'); |
|
} else { |
|
$r->print(&header('Course Request','','','',{ 'only_body' => 1}). |
|
'<div>'. |
|
'<p class="LC_info">'.&mt('You do not have privileges to request creation of LTI courses.').'</p>'. |
|
'</div>'. |
|
&Apache::loncommon::end_page()); |
|
} |
|
} |
|
return OK; |
|
} |
if (($env{'form.crstype'} eq 'textbook') || |
if (($env{'form.crstype'} eq 'textbook') || |
(scalar(keys(%can_request)) == 1) && ($can_request{'textbook'})) { |
(scalar(keys(%can_request)) == 1) && ($can_request{'textbook'})) { |
my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom); |
my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom); |
Line 172 sub handler {
|
Line 197 sub handler {
|
if ($can_request{'textbook'}) { |
if ($can_request{'textbook'}) { |
&process_textbook_request($r,$dom,$action,\%domdefs,\%domconfig,\%can_request); |
&process_textbook_request($r,$dom,$action,\%domdefs,\%domconfig,\%can_request); |
} else { |
} else { |
&textbook_request_disabled($r,$dom,\%can_request); |
&textbook_request_disabled($r,$dom,$action,\%can_request); |
|
} |
|
} elsif ($action eq 'display') { |
|
my ($uname,$udom,$result,$warning) = &domcoord_display($dom); |
|
if ($warning ne '') { |
|
my $args = { only_body => 1 }; |
|
$r->print(&header('Course/Community Requests','','' ,'',$args). |
|
'<h3>'.&mt('Course/Community Request Details').'</h3>'. |
|
'<div class="LC_warning">'.$warning.'</div>'. |
|
&close_popup_form()); |
|
} else { |
|
$states{'display'} = ['details']; |
|
my $loaditems = &onload_action($action,$state); |
|
my $page = 0; |
|
&request_administration($r,$action,$state,$page,\%states,$dom,$jscript, |
|
$loaditems,'','','','','',$showcredits,'','', |
|
$uname,$udom); |
} |
} |
} else { |
} else { |
if ($can_request{'textbook'}) { |
if ($can_request{'textbook'}) { |
&print_textbook_form($r,$dom,\@incdoms,\%domdefs,$domconfig{'requestcourses'},\%can_request); |
&print_textbook_form($r,$dom,\@incdoms,\%domdefs,$domconfig{'requestcourses'}, |
|
\%can_request,'textbook'); |
} else { |
} else { |
&textbook_request_disabled($r,$dom,\%can_request); |
&textbook_request_disabled($r,$dom,$action,\%can_request); |
} |
} |
} |
} |
return OK; |
return OK; |
Line 232 sub handler {
|
Line 274 sub handler {
|
my ($page,$crumb,$newinstcode,$codechk,$checkedcode,$description) = |
my ($page,$crumb,$newinstcode,$codechk,$checkedcode,$description) = |
&get_breadcrumbs($dom,$action,\$state,\%states,\%trail); |
&get_breadcrumbs($dom,$action,\$state,\%states,\%trail); |
if ($action eq 'display') { |
if ($action eq 'display') { |
if (($dom eq $env{'request.role.domain'}) && (&Apache::lonnet::allowed('ccc',$dom))) { |
($uname,$udom,$result,$warning) = &domcoord_display($dom); |
if ($env{'form.cnum'} ne '') { |
|
my $cnum = $env{'form.cnum'}; |
|
my $queue = $env{'form.queue'}; |
|
my $reqkey = $cnum.'_'.$queue; |
|
my $namespace = 'courserequestqueue'; |
|
my $domconfig = &Apache::lonnet::get_domainconfiguser($dom); |
|
my %queued = |
|
&Apache::lonnet::get($namespace,[$reqkey],$dom,$domconfig); |
|
if (ref($queued{$reqkey}) eq 'HASH') { |
|
$uname = $queued{$reqkey}{'ownername'}; |
|
$udom = $queued{$reqkey}{'ownerdom'}; |
|
if (($udom =~ /^$match_domain$/) && ($uname =~ /^$match_username$/)) { |
|
$result = &retrieve_settings($dom,$cnum,$udom,$uname); |
|
} else { |
|
if ($env{'form.crstype'} eq 'community') { |
|
$warning = &mt('Invalid username or domain for community requestor'); |
|
} else { |
|
$warning = &mt('Invalid username or domain for course requestor'); |
|
} |
|
} |
|
} else { |
|
if ($env{'form.crstype'} eq 'community') { |
|
$warning = &mt('No information was found for this community request.'); |
|
} else { |
|
$warning = &mt('No information was found for this course request.'); |
|
} |
|
} |
|
} else { |
|
$warning = &mt('No course request ID provided.'); |
|
} |
|
} else { |
|
if ($env{'form.crstype'} eq 'any') { |
|
$warning = &mt('You do not have rights to view course or community request information.'); |
|
} elsif ($env{'form.crstype'} eq 'community') { |
|
$warning = &mt('You do not have rights to view community request information.'); |
|
} else { |
|
$warning = &mt('You do not have rights to view course request information.'); |
|
} |
|
} |
|
} elsif ((defined($state)) && (defined($action))) { |
} elsif ((defined($state)) && (defined($action))) { |
if (($action eq 'view') && ($state eq 'details')) { |
if (($action eq 'view') && ($state eq 'details')) { |
if ((defined($env{'form.showdom'})) && (defined($env{'form.cnum'}))) { |
if ((defined($env{'form.showdom'})) && (defined($env{'form.cnum'}))) { |
Line 436 function setCloneDisplay(courseForm) {
|
Line 439 function setCloneDisplay(courseForm) {
|
for (var i=0; i<courseForm.cloning.length; i++) { |
for (var i=0; i<courseForm.cloning.length; i++) { |
if (courseForm.cloning[i].checked) { |
if (courseForm.cloning[i].checked) { |
if (courseForm.cloning[i].value == 1) { |
if (courseForm.cloning[i].value == 1) { |
document.getElementById('cloneoptions').style.display="block";; |
document.getElementById('cloneoptions').style.display="block"; |
} |
} |
} |
} |
} |
} |
Line 486 sub get_breadcrumbs {
|
Line 489 sub get_breadcrumbs {
|
} |
} |
} |
} |
} |
} |
for (my $i=0; $i<@{$states->{$action}}; $i++) { |
if (ref($states->{$action}) eq 'ARRAY') { |
if ($$state eq $states->{$action}[$i]) { |
for (my $i=0; $i<@{$states->{$action}}; $i++) { |
&Apache::lonhtmlcommon::add_breadcrumb( |
if ($$state eq $states->{$action}[$i]) { |
{text=>"$trail->{$$state}"}); |
|
$crumb = &Apache::lonhtmlcommon::breadcrumbs('Course/Community Requests','Course_Requests'); |
|
last; |
|
} else { |
|
if (($$state eq 'process') || ($$state eq 'removal') || ($$state eq 'reqauthor')) { |
|
&Apache::lonhtmlcommon::add_breadcrumb( |
&Apache::lonhtmlcommon::add_breadcrumb( |
{ href => '/adm/requestcourse', |
{text=>"$trail->{$$state}"}); |
text => "$trail->{$states->{$action}[$i]}", |
$crumb = &Apache::lonhtmlcommon::breadcrumbs('Course/Community Requests','Course_Requests'); |
} |
last; |
); |
|
} else { |
} else { |
&Apache::lonhtmlcommon::add_breadcrumb( |
if (($$state eq 'process') || ($$state eq 'removal') || ($$state eq 'reqauthor')) { |
|
&Apache::lonhtmlcommon::add_breadcrumb( |
|
{ href => '/adm/requestcourse', |
|
text => "$trail->{$states->{$action}[$i]}", |
|
} |
|
); |
|
} else { |
|
&Apache::lonhtmlcommon::add_breadcrumb( |
{ href => "javascript:backPage(document.requestcrs,'$states->{$action}[$i]')", |
{ href => "javascript:backPage(document.requestcrs,'$states->{$action}[$i]')", |
text => "$trail->{$states->{$action}[$i]}", } |
text => "$trail->{$states->{$action}[$i]}", } |
); |
); |
} |
} |
} |
} |
} |
} |
|
} |
} else { |
} else { |
&Apache::lonhtmlcommon::add_breadcrumb( |
&Apache::lonhtmlcommon::add_breadcrumb( |
{text=>'Pick Action'}); |
{text=>'Pick Action'}); |
Line 559 sub form_elements {
|
Line 564 sub form_elements {
|
clonedom => 'selectbox', |
clonedom => 'selectbox', |
datemode => 'radio', |
datemode => 'radio', |
dateshift => 'text', |
dateshift => 'text', |
|
tinyurls => 'radio', |
}, |
}, |
enrollment => { |
enrollment => { |
accessstart_month => 'selectbox', |
accessstart_month => 'selectbox', |
Line 765 function check_can_request(crschoice,act
|
Line 771 function check_can_request(crschoice,act
|
var unofficial = ''; |
var unofficial = ''; |
var community = ''; |
var community = ''; |
var textbook = ''; |
var textbook = ''; |
|
var placement = ''; |
END |
END |
if (ref($can_request) eq 'HASH') { |
if (ref($can_request) eq 'HASH') { |
foreach my $item (keys(%{$can_request})) { |
foreach my $item (keys(%{$can_request})) { |
Line 773 END
|
Line 780 END
|
"; |
"; |
} |
} |
} |
} |
my %lt = &Apache::lonlocal::texthash( |
my %js_lt = &Apache::lonlocal::texthash( |
official => 'You are not permitted to request creation of an official course in this domain.', |
official => 'You are not permitted to request creation of an official course in this domain.', |
unofficial => 'You are not permitted to request creation of an unofficial course in this domain.', |
unofficial => 'You are not permitted to request creation of an unofficial course in this domain.', |
community => 'You are not permitted to request creation of a community in this domain.', |
community => 'You are not permitted to request creation of a community in this domain.', |
textbook => 'You are not permitted to request creation of a textbook course in this domain', |
textbook => 'You are not permitted to request creation of a textbook course in this domain', |
|
placement => 'You are not permitted to request creation of a placement test in this domain', |
all => 'You must choose a specific course type when making a new course request.', |
all => 'You must choose a specific course type when making a new course request.', |
allt => '"All types" is not allowed.', |
allt => '"All types" is not allowed.', |
); |
); |
|
&js_escape(\%js_lt); |
$js .= <<END; |
$js .= <<END; |
if (crschoice == 'official') { |
if (crschoice == 'official') { |
if (official != 1) { |
if (official != 1) { |
alert("$lt{'official'}"); |
alert("$js_lt{'official'}"); |
return false; |
return false; |
} |
} |
} else { |
} else { |
if (crschoice == 'unofficial') { |
if (crschoice == 'unofficial') { |
if (unofficial != 1) { |
if (unofficial != 1) { |
alert("$lt{'unofficial'}"); |
alert("$js_lt{'unofficial'}"); |
return false; |
return false; |
} |
} |
} else { |
} else { |
if (crschoice == 'community') { |
if (crschoice == 'community') { |
if (community != 1) { |
if (community != 1) { |
alert("$lt{'community'}"); |
alert("$js_lt{'community'}"); |
return false; |
return false; |
} |
} |
} else { |
} else { |
if (crschoice == 'textbook') { |
if (crschoice == 'textbook') { |
if (textbook != 1) { |
if (textbook != 1) { |
alert("$lt{'community'}"); |
alert("$js_lt{'textbook'}"); |
return false; |
return false; |
} |
} |
} else { |
} else { |
if (actionchoice == 'new') { |
if (crschoice == 'placement') { |
alert('$lt{'all'}'+'\\n'+'$lt{'allt'}'); |
if (placement != 1) { |
return false; |
alert("$js_lt{'placement'}"); |
|
return false; |
|
} |
|
} else { |
|
if (actionchoice == 'new') { |
|
alert('$js_lt{'all'}'+'\\n'+'$js_lt{'allt'}'); |
|
return false; |
|
} |
} |
} |
} |
} |
} |
} |
Line 819 END
|
Line 835 END
|
END |
END |
my ($pagetitle,$pageinfo,$domaintitle,$earlyout); |
my ($pagetitle,$pageinfo,$domaintitle,$earlyout); |
if (ref($can_request) eq 'HASH') { |
if (ref($can_request) eq 'HASH') { |
if (($can_request->{'official'}) || ($can_request->{'unofficial'}) || $can_request->{'textbook'}) { |
if (($can_request->{'official'}) || ($can_request->{'unofficial'}) || ($can_request->{'textbook'}) || ($can_request->{'placement'})) { |
if ($can_request->{'community'}) { |
if ($can_request->{'community'}) { |
$pagetitle = 'Course/Community Requests'; |
$pagetitle = 'Course/Community Requests'; |
$pageinfo = &mt('Request creation of a new course or community, or review your pending requests.'); |
$pageinfo = &mt('Request creation of a new course or community, or review your pending requests.'); |
Line 944 END
|
Line 960 END
|
if ($action eq 'new') { |
if ($action eq 'new') { |
my $jsextra; |
my $jsextra; |
if (($state eq 'courseinfo') || ($state eq 'codepick')) { |
if (($state eq 'courseinfo') || ($state eq 'codepick')) { |
$jsextra = "\n".&Apache::loncommon::coursebrowser_javascript($dom); |
$jsextra = "\n".&Apache::loncommon::coursebrowser_javascript($dom,'','','','','', |
|
$newinstcode); |
} elsif ($state eq 'enrollment') { |
} elsif ($state eq 'enrollment') { |
if (($env{'form.crstype'} eq 'official') && |
if (($env{'form.crstype'} eq 'official') && |
(&Apache::lonnet::auto_run('',$dom))) { |
(&Apache::lonnet::auto_run('',$dom))) { |
Line 995 END
|
Line 1012 END
|
$title = &mt('Pending requests for unofficial courses'); |
$title = &mt('Pending requests for unofficial courses'); |
} elsif ($env{'form.crstype'} eq 'textbook') { |
} elsif ($env{'form.crstype'} eq 'textbook') { |
$title = &mt('Pending requests for textbook courses'); |
$title = &mt('Pending requests for textbook courses'); |
|
} elsif ($env{'form.crstype'} eq 'textbook') { |
|
$title = &mt('Pending requests for placement tests'); |
} else { |
} else { |
$title = &mt('Pending course/community requests'); |
$title = &mt('Pending course/community requests'); |
} |
} |
Line 1129 END
|
Line 1148 END
|
return; |
return; |
} |
} |
|
|
|
sub domcoord_display { |
|
my ($dom) = @_; |
|
my ($uname,$udom,$result,$warning); |
|
if (($dom eq $env{'request.role.domain'}) && (&Apache::lonnet::allowed('ccc',$dom))) { |
|
if ($env{'form.cnum'} ne '') { |
|
my $cnum = $env{'form.cnum'}; |
|
my $queue = $env{'form.queue'}; |
|
my $reqkey = $cnum.'_'.$queue; |
|
my $namespace = 'courserequestqueue'; |
|
my $domconfig = &Apache::lonnet::get_domainconfiguser($dom); |
|
my %queued = |
|
&Apache::lonnet::get($namespace,[$reqkey],$dom,$domconfig); |
|
if (ref($queued{$reqkey}) eq 'HASH') { |
|
$uname = $queued{$reqkey}{'ownername'}; |
|
$udom = $queued{$reqkey}{'ownerdom'}; |
|
if (($udom =~ /^$match_domain$/) && ($uname =~ /^$match_username$/)) { |
|
$result = &retrieve_settings($dom,$cnum,$udom,$uname); |
|
} else { |
|
if ($env{'form.crstype'} eq 'community') { |
|
$warning = &mt('Invalid username or domain for community requestor'); |
|
} else { |
|
$warning = &mt('Invalid username or domain for course requestor'); |
|
} |
|
} |
|
} else { |
|
if ($env{'form.crstype'} eq 'community') { |
|
$warning = &mt('No information was found for this community request.'); |
|
} else { |
|
$warning = &mt('No information was found for this course request.'); |
|
} |
|
} |
|
} else { |
|
$warning = &mt('No course request ID provided.'); |
|
} |
|
} else { |
|
if ($env{'form.crstype'} eq 'any') { |
|
$warning = &mt('You do not have rights to view course or community request information.'); |
|
} elsif ($env{'form.crstype'} eq 'community') { |
|
$warning = &mt('You do not have rights to view community request information.'); |
|
} else { |
|
$warning = &mt('You do not have rights to view course request information.'); |
|
} |
|
} |
|
return ($uname,$udom,$result,$warning); |
|
} |
|
|
sub enrollment_lcsec_js { |
sub enrollment_lcsec_js { |
my %alerts = §ion_check_alerts(); |
my %alerts = §ion_check_alerts(); |
my $secname = $alerts{'badsec'}; |
my $secname = $alerts{'badsec'}; |
my $secnone = $alerts{'reserved'}; |
my $secnone = $alerts{'reserved'}; |
|
&js_escape(\$secname); |
|
&js_escape(\$secnone); |
my $output = ' |
my $output = ' |
function validateEnrollSections(formname,nextstate) { |
function validateEnrollSections(formname,nextstate) { |
var badsectotal = 0; |
var badsectotal = 0; |
Line 1190 function validateEnrollSections(formname
|
Line 1257 function validateEnrollSections(formname
|
|
|
sub personnel_lcsec_js { |
sub personnel_lcsec_js { |
my %alerts = §ion_check_alerts(); |
my %alerts = §ion_check_alerts(); |
my $secname = $alerts{'badsec'}.'\\n'.$alerts{'separate'}; |
my $secname = $alerts{'badsec'}."\n".$alerts{'separate'}; |
my $secnone = $alerts{'reserved'}; |
my $secnone = $alerts{'reserved'}; |
|
&js_escape(\$secname); |
|
&js_escape(\$secnone); |
my $output = ' |
my $output = ' |
function validatePersonnelSections(formname,nextstate) { |
function validatePersonnelSections(formname,nextstate) { |
var badsectotal = 0; |
var badsectotal = 0; |
Line 1526 sub print_request_form {
|
Line 1595 sub print_request_form {
|
&Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles, |
&Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles, |
\%cat_order,\@code_order); |
\%cat_order,\@code_order); |
} |
} |
my ($storeresult,$result) = &print_request_outcome($dom,\@codetitles, |
my $lonhost = $r->dir_config('lonHostID'); |
\@code_order,$instcredits); |
my ($storeresult,$result,$customized) = &print_request_outcome($r,$lonhost,$dom,\@codetitles, |
|
\@code_order,$instcredits); |
$r->print($result); |
$r->print($result); |
if (($storeresult eq 'ok') || ($storeresult eq 'created')) { |
if (($storeresult eq 'ok') || ($storeresult eq 'created')) { |
if ($storeresult eq 'ok') { |
if ($storeresult eq 'ok') { |
Line 1536 sub print_request_form {
|
Line 1606 sub print_request_form {
|
'<a href="/adm/requestcourse">'.&mt('Make another request').'</a></p>'); |
'<a href="/adm/requestcourse">'.&mt('Make another request').'</a></p>'); |
} |
} |
if (&Apache::loncoursequeueadmin::author_prompt()) { |
if (&Apache::loncoursequeueadmin::author_prompt()) { |
&print_author_prompt($r,$env{'form.action'},$env{'form.cnum'},$env{'form.showdom'}, |
unless ($customized) { |
$env{'form.crstype'},$storeresult); |
&print_author_prompt($r,$env{'form.action'},$env{'form.cnum'},$env{'form.showdom'}, |
|
$env{'form.crstype'},$storeresult); |
|
} |
} elsif ($storeresult eq 'created') { |
} elsif ($storeresult eq 'created') { |
$r->print('<p><a href="/adm/requestcourse">'.&mt('Make another request').'</a></p>'); |
unless ($customized) { |
|
$r->print('<p><a href="/adm/requestcourse">'.&mt('Make another request').'</a></p>'); |
|
} |
} |
} |
} |
} |
} elsif ($state eq 'reqauthor') { |
} elsif ($state eq 'reqauthor') { |
Line 1549 sub print_request_form {
|
Line 1623 sub print_request_form {
|
if ($result eq 'created') { |
if ($result eq 'created') { |
my $role = 'au'; |
my $role = 'au'; |
my $spec = "$role./$env{'form.showdom'}/"; |
my $spec = "$role./$env{'form.showdom'}/"; |
push(@links,&mt('Enter your authoring space with role: [_1]', |
push(@links,&mt('Enter your Authoring Space with role: [_1]', |
'<a href="/adm/roles?selectrole=1&'.$spec.'=1">'. |
'<a href="/adm/roles?selectrole=1&'.$spec.'=1">'. |
&Apache::lonnet::plaintext($role).'</a>')); |
&Apache::lonnet::plaintext($role).'</a>')); |
} |
} |
Line 1624 sub print_request_form {
|
Line 1698 sub print_request_form {
|
|
|
sub print_author_prompt { |
sub print_author_prompt { |
my ($r,$action,$cnum,$showdom,$crstype,$storeresult) = @_; |
my ($r,$action,$cnum,$showdom,$crstype,$storeresult) = @_; |
$r->print('<h3>'.&mt('Access to authoring space').'</h3>'. |
$r->print('<h3>'.&mt('Access to Authoring Space').'</h3>'. |
'<p>'. |
'<p>'. |
&mt('Although assessment items can be created directly inside a course, such items only use part of the assessment capabilities of LON-CAPA.'). |
&mt('Although assessment items can be created directly inside a course, such items only use part of the assessment capabilities of LON-CAPA.'). |
'<br />'. |
'<br />'. |
&mt('By contrast, items created in authoring space, then imported into a course, can use all of the features of the assessment engine.').'</p>'. |
&mt('By contrast, items created in Authoring Space, then imported into a course, can use all of the features of the assessment engine.').'</p>'. |
'<p>'.&mt('Request authoring space access now?'). |
'<p>'.&mt('Request Authoring Space access now?'). |
'<span class="LC_nobreak"> '. |
'<span class="LC_nobreak"> '. |
'<label><input type="radio" name="requestauthor" value="1" />'.&mt('Yes').'</label>'. |
'<label><input type="radio" name="requestauthor" value="1" />'.&mt('Yes').'</label>'. |
(' 'x2). |
(' 'x2). |
Line 2041 sub print_personnel_menu {
|
Line 2115 sub print_personnel_menu {
|
official => 'Requestor is automatically assigned Course Coordinator role.', |
official => 'Requestor is automatically assigned Course Coordinator role.', |
); |
); |
$lt{'unofficial'} = $lt{'official'}; |
$lt{'unofficial'} = $lt{'official'}; |
$lt{'textbook'} = $lt{'textbook'}; |
$lt{'textbook'} = $lt{'official'}; |
|
$lt{'placement'} = $lt{'official'}; |
$output .= &Apache::lonhtmlcommon::row_headline(). |
$output .= &Apache::lonhtmlcommon::row_headline(). |
'<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Personnel').' '.$lt{$crstype}.' '.&mt('Include other personnel?').'</h3>'; |
'<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Personnel').' '.$lt{$crstype}.' '.&mt('Include other personnel?').'</h3>'; |
} |
} |
for (my $i=0; $i<$persontotal; $i++) { |
my $cansearch = 1; |
|
my @alldoms = &Apache::lonnet::all_domains(); |
|
if (@alldoms == 1) { |
|
my %domsrch = &Apache::lonnet::get_dom('configuration', |
|
['directorysrch'],$alldoms[0]); |
|
if (ref($domsrch{'directorysrch'}) eq 'HASH') { |
|
if ((!$domsrch{'directorysrch'}{'available'}) && |
|
($domsrch{'directorysrch'}{'lcavailable'} eq '0')) { |
|
$cansearch = 0; |
|
} |
|
} |
|
} |
|
my ($trusted,$untrusted) = &Apache::lonnet::trusted_domains('enroll',$dom); |
|
for (my $i=0; $i<$persontotal; $i++) { |
my @linkargs = map { 'person_'.$i.'_'.$_ } (@items); |
my @linkargs = map { 'person_'.$i.'_'.$_ } (@items); |
my $linkargstr = join("','",@linkargs); |
my $linkargstr = join("','",@linkargs); |
my $uname_form = '<input type="text" name="person_'.$i.'_uname" value="" size="20" />'; |
my $uname_form = '<input type="text" name="person_'.$i.'_uname" value="" size="20" />'; |
my $onchange = 'javascript:fix_domain('."'$formname','person_".$i."_dom',". |
my $onchange = 'javascript:fix_domain('."'$formname','person_".$i."_dom',". |
"'person_".$i."_hidedom','person_".$i."_uname'".');'; |
"'person_".$i."_hidedom','person_".$i."_uname'".');'; |
my $udom_form = &Apache::loncommon::select_dom_form($dom,'person_'.$i.'_dom','', |
my $udom_form = &Apache::loncommon::select_dom_form($dom,'person_'.$i.'_dom','', |
1,$onchange). |
1,$onchange,undef,$trusted,$untrusted). |
'<input type="hidden" name="person_'.$i.'_hidedom" value="" />'; |
'<input type="hidden" name="person_'.$i.'_hidedom" value="" />'; |
my %form_elems; |
my %form_elems; |
foreach my $item (@items) { |
foreach my $item (@items) { |
Line 2069 sub print_personnel_menu {
|
Line 2157 sub print_personnel_menu {
|
} |
} |
$sectionselector .= $newtitle. |
$sectionselector .= $newtitle. |
'<input type="text" name="person_'.$i.'_newsec" size="15" value="" />'."\n"; |
'<input type="text" name="person_'.$i.'_newsec" size="15" value="" />'."\n"; |
my $usersrchlinktxt = &mt('Search for user'); |
my $usersrchlink; |
my $usersrchlink = &Apache::loncommon::selectuser_link($formname,@linkargs,$dom, |
if ($cansearch) { |
$usersrchlinktxt); |
my $usersrchlinktxt = &mt('Search for user'); |
|
$usersrchlink = &Apache::loncommon::selectuser_link($formname,@linkargs,$dom, |
|
$usersrchlinktxt); |
|
} else { |
|
$usersrchlink = ' '; |
|
} |
my $userchklinktxt = &mt('Check username'); |
my $userchklinktxt = &mt('Check username'); |
my $userchklink = &Apache::loncommon::selectuser_link($formname,@linkargs,$dom, |
my $userchklink = &Apache::loncommon::selectuser_link($formname,@linkargs,$dom, |
$userchklinktxt,'checkusername'); |
$userchklinktxt,'checkusername'); |
Line 2318 sub print_cancel_request {
|
Line 2411 sub print_cancel_request {
|
&Apache::loncommon::start_data_table_row(). |
&Apache::loncommon::start_data_table_row(). |
'<td>'.$history{details}{'cdescr'}.'</td><td>'. |
'<td>'.$history{details}{'cdescr'}.'</td><td>'. |
&Apache::lonlocal::locallocaltime($timestamp).'</td>'. |
&Apache::lonlocal::locallocaltime($timestamp).'</td>'. |
'<td>'.$showtype.'</td>'. |
'<td>'.&mt($showtype).'</td>'. |
&Apache::loncommon::end_data_table_row(). |
&Apache::loncommon::end_data_table_row(). |
&Apache::loncommon::end_data_table(). |
&Apache::loncommon::end_data_table(). |
'<br /><div class="LC_warning">'; |
'<br /><div class="LC_warning">'; |
Line 2373 ENDJS
|
Line 2466 ENDJS
|
} |
} |
|
|
sub viewcancel_javascript { |
sub viewcancel_javascript { |
my $alert = &mt('Are you sure you want to cancel this request?').'\\n'. |
my $alert = &mt('Are you sure you want to cancel this request?')."\n". |
&mt('Your request will be removed.'); |
&mt('Your request will be removed.'); |
|
&js_escape(\$alert); |
return << "ENDJS"; |
return << "ENDJS"; |
function nextPage(formname,nextstate) { |
function nextPage(formname,nextstate) { |
if (confirm('$alert')) { |
if (confirm('$alert')) { |
Line 2451 sub print_request_logs {
|
Line 2545 sub print_request_logs {
|
if (ref($domconfig{'requestcourses'}) eq 'HASH') { |
if (ref($domconfig{'requestcourses'}) eq 'HASH') { |
if (ref($domconfig{'requestcourses'}{'uniquecode'}) eq 'HASH') { |
if (ref($domconfig{'requestcourses'}{'uniquecode'}) eq 'HASH') { |
if ($curr{'crstype'} eq 'any') { |
if ($curr{'crstype'} eq 'any') { |
my @types = qw(official unofficial community textbook); |
my @types = qw(official unofficial community textbook placement); |
foreach my $type (@types) { |
foreach my $type (@types) { |
if ($domconfig{'requestcourses'}{'uniquecode'}{$type}) { |
if ($domconfig{'requestcourses'}{'uniquecode'}{$type}) { |
$showuniquecode = 1; |
$showuniquecode = 1; |
Line 2619 sub reqstatus_names {
|
Line 2713 sub reqstatus_names {
|
rejected => 'Request rejected', |
rejected => 'Request rejected', |
cancelled => 'Request cancelled', |
cancelled => 'Request cancelled', |
); |
); |
if (($crstype eq 'official') || ($crstype eq 'unofficial') || ($crstype eq 'textbook')) { |
if (($crstype eq 'official') || ($crstype eq 'unofficial') || ($crstype eq 'textbook') || ($crstype eq 'placement')) { |
$statusnames{'created'} = &mt('Course created'); |
$statusnames{'created'} = &mt('Course created'); |
} elsif ($crstype eq 'community') { |
} elsif ($crstype eq 'community') { |
$statusnames{'created'} = &mt('Community created'); |
$statusnames{'created'} = &mt('Community created'); |
Line 2632 sub requestlog_display_filter {
|
Line 2726 sub requestlog_display_filter {
|
my $nolink = 1; |
my $nolink = 1; |
my $output = '<table><tr><td valign="top">'. |
my $output = '<table><tr><td valign="top">'. |
'<span class="LC_nobreak"><b>'.&mt('Records/page:').'</b></span><br />'. |
'<span class="LC_nobreak"><b>'.&mt('Records/page:').'</b></span><br />'. |
&Apache::lonmeta::selectbox('show',$curr->{'show'},undef, |
&Apache::lonmeta::selectbox('show',$curr->{'show'},'',undef, |
(&mt('all'),5,10,20,50,100,1000,10000)). |
(&mt('all'),5,10,20,50,100,1000,10000)). |
'</td><td> </td>'; |
'</td><td> </td>'; |
my $startform = |
my $startform = |
Line 2671 sub requestlog_display_filter {
|
Line 2765 sub requestlog_display_filter {
|
$typename = $typenames->{$crstype}; |
$typename = $typenames->{$crstype}; |
} |
} |
} |
} |
$output .= '<option value="'.$crstype.'"'.$selstr.'>'.$typename.'</option>'."\n"; |
$output .= '<option value="'.$crstype.'"'.$selstr.'>'.&mt($typename).'</option>'."\n"; |
} |
} |
$output .= '</select></td>'; |
$output .= '</select></td>'; |
} |
} |
Line 2746 sub print_review {
|
Line 2840 sub print_review {
|
|
|
my $enrollrow_title = &mt('Default Access Dates').'<br />'. |
my $enrollrow_title = &mt('Default Access Dates').'<br />'. |
'('.&Apache::lonnet::plaintext('st',$category).')'; |
'('.&Apache::lonnet::plaintext('st',$category).')'; |
|
my $instcode; |
if ($env{'form.crstype'} eq 'official') { |
if ($env{'form.crstype'} eq 'official') { |
if ((ref($codetitles) eq 'ARRAY') && (ref($cat_titles) eq 'HASH')) { |
if ((ref($codetitles) eq 'ARRAY') && (ref($cat_titles) eq 'HASH')) { |
foreach my $title (@{$codetitles}) { |
foreach my $title (@{$codetitles}) { |
Line 2761 sub print_review {
|
Line 2856 sub print_review {
|
} |
} |
} |
} |
} |
} |
|
if (ref($code_order) eq 'ARRAY') { |
|
foreach my $item (@{$code_order}) { |
|
$instcode .= $env{'form.instcode_'.$item}; |
|
} |
|
} |
$inst_headers .= '<th>'.&mt('Credits').'</th>'; |
$inst_headers .= '<th>'.&mt('Credits').'</th>'; |
if ($instcredits) { |
if ($instcredits) { |
$inst_values .= '<td>'.$instcredits.'</td>'; |
$inst_values .= '<td>'.$instcredits.'</td>'; |
Line 2841 sub print_review {
|
Line 2941 sub print_review {
|
$inst_values .= '<td>'.$env{'form.coursecredits'}.'</td>'; |
$inst_values .= '<td>'.$env{'form.coursecredits'}.'</td>'; |
} |
} |
|
|
my %ctxt = &clone_text(); |
my %ctxt = &clone_text($env{'form.crstype'}); |
$inst_headers .= '<th>'.&mt('Clone From').'</th>'; |
$inst_headers .= '<th>'.&mt('Clone From').'</th>'; |
if (($env{'form.cloning'}) && |
if (($env{'form.cloning'}) && |
($env{'form.clonecrs'} =~ /^$match_name$/) && |
($env{'form.clonecrs'} =~ /^$match_name$/) && |
($env{'form.clonedom'} =~ /^$match_domain$/)) { |
($env{'form.clonedom'} =~ /^$match_domain$/)) { |
my $canclone = &Apache::loncoursequeueadmin::can_clone_course($uname, |
my $canclone = &Apache::loncoursequeueadmin::can_clone_course($uname, |
$udom,$env{'form.clonecrs'},$env{'form.clonedom'}, |
$udom,$env{'form.clonecrs'},$env{'form.clonedom'}, |
$env{'form.crstype'}); |
$env{'form.crstype'},$dom,$instcode); |
if ($canclone) { |
if ($canclone) { |
my %courseenv = &Apache::lonnet::userenvironment($env{'form.clonedom'}, |
my %courseenv = &Apache::lonnet::userenvironment($env{'form.clonedom'}, |
$env{'form.clonecrs'},('description','internal.coursecode')); |
$env{'form.clonecrs'},('description','internal.coursecode')); |
if (keys(%courseenv) > 0) { |
if (keys(%courseenv) > 0) { |
$inst_headers .= '<th>'.$ctxt{'dsh'}.'</th>'; |
$inst_headers .= '<th>'.$ctxt{'dsh'}.'</th>'. |
|
'<th>'.$ctxt{'dpl'}.'</th>'; |
$inst_values .= '<td>'.$courseenv{'description'}.' '; |
$inst_values .= '<td>'.$courseenv{'description'}.' '; |
my $cloneinst = $courseenv{'internal.coursecode'}; |
my $cloneinst = $courseenv{'internal.coursecode'}; |
if ($cloneinst ne '') { |
if ($cloneinst ne '') { |
Line 2869 sub print_review {
|
Line 2970 sub print_review {
|
} else { |
} else { |
$inst_values .= $ctxt{'ncd'}; |
$inst_values .= $ctxt{'ncd'}; |
} |
} |
|
$inst_values .= '</td><td>'; |
|
if ($env{'form.tinyurls'} eq 'delete') { |
|
$inst_values .= $ctxt{'nsl'}; |
|
} elsif ($env{'form.tinyurls'} eq 'transfer') { |
|
$inst_values .= $ctxt{'tsl'}; |
|
} else { |
|
$inst_values .= $ctxt{'csl'}; |
|
} |
$inst_values .= '</td>'; |
$inst_values .= '</td>'; |
} else { |
} else { |
$inst_values .= '<td>'.&mt('Unknown').'</td>'; |
$inst_values .= '<td>'.&mt('Unknown').'</td>'; |
Line 3010 sub dates_from_form {
|
Line 3119 sub dates_from_form {
|
|
|
sub courseinfo_form { |
sub courseinfo_form { |
my ($dom,$formname,$crstype,$next,$description) = @_; |
my ($dom,$formname,$crstype,$next,$description) = @_; |
my %lt = &Apache::lonlocal::texthash( |
my %js_lt = &Apache::lonlocal::texthash( |
official => 'You must provide a (brief) course description.', |
official => 'You must provide a (brief) course description.', |
community => 'You must provide a (brief) community description.' |
community => 'You must provide a (brief) community description.' |
); |
); |
$lt{'unofficial'} = $lt{'official'}; |
&js_escape(\%js_lt); |
$lt{'textbook'} = $lt{'official'}; |
$js_lt{'unofficial'} = $js_lt{'official'}; |
|
$js_lt{'textbook'} = $js_lt{'official'}; |
|
$js_lt{'placement'} = $js_lt{'official'}; |
my $js_validate = <<"ENDJS"; |
my $js_validate = <<"ENDJS"; |
<script type="text/javascript"> |
<script type="text/javascript"> |
// <![CDATA[' |
// <![CDATA[' |
|
|
function validateForm() { |
function validateForm() { |
if ((document.$formname.cdescr.value == "") || (document.$formname.cdescr.value == "undefined")) { |
if ((document.$formname.cdescr.value == "") || (document.$formname.cdescr.value == "undefined")) { |
alert('$lt{$crstype}'); |
alert('$js_lt{$crstype}'); |
return; |
return; |
} |
} |
nextPage(document.$formname,'$next'); |
nextPage(document.$formname,'$next'); |
Line 3095 sub clone_form {
|
Line 3206 sub clone_form {
|
my $type = 'Course'; |
my $type = 'Course'; |
if ($crstype eq 'community') { |
if ($crstype eq 'community') { |
$type = 'Community'; |
$type = 'Community'; |
|
} elsif ($crstype eq 'placement') { |
|
$type = 'Placement'; |
} |
} |
my %lt = &clone_text(); |
my %lt = &clone_text($crstype); |
my $output .= |
my $output .= |
&Apache::lonhtmlcommon::row_title($lt{'dmn'}).'<label>'. |
&Apache::lonhtmlcommon::row_title($lt{'dmn'}).'<label>'. |
&Apache::loncommon::select_dom_form($dom,'clonedom').'</label>'. |
&Apache::loncommon::select_dom_form($dom,'clonedom').'</label>'. |
&Apache::lonhtmlcommon::row_closure(1). |
&Apache::lonhtmlcommon::row_closure(1). |
&Apache::lonhtmlcommon::row_title($lt{'cid'}).'<label>'. |
&Apache::lonhtmlcommon::row_title($lt{'cid'}).'<label>'. |
'<input type="text" size="25" name="clonecrs" value="" onfocus="this.blur();opencrsbrowser('."'$formname','clonecrs','clonedom','','','','','$type'".')" />'. |
'<input type="text" size="25" name="clonecrs" value="" onfocus="this.blur();opencrsbrowser('."'$formname','clonecrs','clonedom','','','','$type'".')" />'. |
'</label> '. |
'</label> '. |
&Apache::loncommon::selectcourse_link($formname,'clonecrs','clonedom','','','',$type). |
&Apache::loncommon::selectcourse_link($formname,'clonecrs','clonedom','','','',$type). |
&Apache::lonhtmlcommon::row_closure(1). |
&Apache::lonhtmlcommon::row_closure(1). |
Line 3113 sub clone_form {
|
Line 3226 sub clone_form {
|
'</label><br /><label>'. |
'</label><br /><label>'. |
'<input type="radio" name="datemode" value="shift" checked="checked" /> '. |
'<input type="radio" name="datemode" value="shift" checked="checked" /> '. |
$lt{'shd'}.'</label>'. |
$lt{'shd'}.'</label>'. |
'<input type="text" size="5" name="dateshift" value="365" />'. |
'<input type="text" size="5" name="dateshift" value="364" />'. |
|
&Apache::lonhtmlcommon::row_closure(1). |
|
&Apache::lonhtmlcommon::row_title($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(1); |
&Apache::lonhtmlcommon::row_closure(1); |
return $output; |
return $output; |
} |
} |
|
|
sub clone_text { |
sub clone_text { |
return &Apache::lonlocal::texthash( |
my ($crstype) = @_; |
|
my %lt = &Apache::lonlocal::texthash( |
'cid' => 'Course ID', |
'cid' => 'Course ID', |
'dmn' => 'Domain', |
'dmn' => 'Domain', |
'dsh' => 'Date Shift', |
'dsh' => 'Date Shift', |
'ncd' => 'Do not clone date parameters', |
'ncd' => 'Do not clone date parameters', |
'prd' => 'Clone date parameters as-is', |
'prd' => 'Clone date parameters as-is', |
'shd' => 'Shift date parameters by number of days', |
'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', |
|
); |
|
if ($crstype eq 'Community') { |
|
$lt{'tsl'} = &mt('Transfer URL shortcuts from existing course to new community'); |
|
$lt{'csl'} = &mt('Create new URL shortcuts in new course'); |
|
} |
|
return %lt; |
} |
} |
|
|
sub coursecode_form { |
sub coursecode_form { |
Line 3152 sub coursecode_form {
|
Line 3283 sub coursecode_form {
|
} |
} |
if (@{$codetitles} > 0) { |
if (@{$codetitles} > 0) { |
my $lastitem = pop(@{$codetitles}); |
my $lastitem = pop(@{$codetitles}); |
my $lastinput = '<input type="text" size="5" name="'.$sel.'_'. $lastitem.'" />'; |
my $lastinput = '<input type="text" size="5" name="'.$sel.'_'.$lastitem.'" />'; |
if (@{$codetitles} > 0) { |
if (@{$codetitles} > 0) { |
my $helplink; |
my $helplink; |
if (defined($helpitem{$context})) { |
if (defined($helpitem{$context})) { |
Line 3260 sub get_course_dom {
|
Line 3391 sub get_course_dom {
|
return $env{'user.domain'}; |
return $env{'user.domain'}; |
} |
} |
} |
} |
my @possible_doms; |
my (@possible_doms,%willtrust); |
foreach my $type (@{$types}) { |
foreach my $type (@{$types}) { |
my $dom_str = $env{'environment.reqcrsotherdom.'.$type}; |
my $dom_str = $env{'environment.reqcrsotherdom.'.$type}; |
if ($dom_str ne '') { |
if ($dom_str ne '') { |
my @domains = split(',',$dom_str); |
my @domains = split(',',$dom_str); |
foreach my $entry (@domains) { |
foreach my $entry (@domains) { |
my ($extdom,$extopt) = split(':',$entry); |
my ($extdom,$extopt) = split(':',$entry); |
if ($extdom eq $env{'request.role.domain'}) { |
unless (exists($willtrust{$extdom})) { |
return $extdom; |
$willtrust{$extdom} = &Apache::lonnet::will_trust('reqcrs',$env{'user.domain'},$extdom); |
} |
} |
unless(grep(/^\Q$extdom\E$/,@possible_doms)) { |
if ($willtrust{$extdom}) { |
push(@possible_doms,$extdom); |
if ($extdom eq $env{'request.role.domain'}) { |
|
return $extdom; |
|
} |
|
unless(grep(/^\Q$extdom\E$/,@possible_doms)) { |
|
push(@possible_doms,$extdom); |
|
} |
} |
} |
} |
} |
} |
} |
Line 3335 sub display_navbuttons {
|
Line 3471 sub display_navbuttons {
|
} |
} |
|
|
sub print_request_outcome { |
sub print_request_outcome { |
my ($dom,$codetitles,$code_order,$instcredits) = @_; |
my ($r,$lonhost,$dom,$codetitles,$code_order,$instcredits) = @_; |
my ($output,$cnum,$now,$req_notifylist,$crstype,$enrollstart,$enrollend, |
my ($output,$cnum,$now,$req_notifylist,$crstype,$enrollstart,$enrollend, |
%sections,%crosslistings,%personnel,@baduname,@missingdom,%domconfig, |
%sections,%crosslistings,%personnel,@baduname,@missingdom,%domconfig, |
$uniquecode); |
$uniquecode); |
Line 3546 sub print_request_outcome {
|
Line 3682 sub print_request_outcome {
|
my $canclone = |
my $canclone = |
&Apache::loncoursequeueadmin::can_clone_course($env{'user.name'}, |
&Apache::loncoursequeueadmin::can_clone_course($env{'user.name'}, |
$env{'user.domain'},$env{'form.clonecrs'},$env{'form.clonedom'}, |
$env{'user.domain'},$env{'form.clonecrs'},$env{'form.clonedom'}, |
$crstype); |
$crstype,$dom,$instcode); |
if ($canclone) { |
if ($canclone) { |
$clonecrs = $env{'form.clonecrs'}; |
$clonecrs = $env{'form.clonecrs'}; |
$clonedom = $env{'form.clonedom'}; |
$clonedom = $env{'form.clonedom'}; |
} |
} |
} |
} |
} |
} |
|
if ($env{'form.chome'} eq 'default') { |
|
my %servers = &Apache::lonnet::get_servers($dom,'library'); |
|
my $numlib = keys(%servers); |
|
if ($numlib) { |
|
my $loadm=10000000; |
|
my $chome; |
|
foreach my $tryserver (keys(%servers)) { |
|
($chome,$loadm) = |
|
&Apache::lonnet::compare_server_load($tryserver,$chome,$loadm); |
|
} |
|
$env{'form.chome'} = $chome; |
|
} |
|
} |
my $details = { |
my $details = { |
owner => $env{'user.name'}, |
owner => $env{'user.name'}, |
domain => $env{'user.domain'}, |
domain => $env{'user.domain'}, |
Line 3568 sub print_request_outcome {
|
Line 3717 sub print_request_outcome {
|
clonecrs => $clonecrs, |
clonecrs => $clonecrs, |
datemode => $env{'form.datemode'}, |
datemode => $env{'form.datemode'}, |
dateshift => $env{'form.dateshift'}, |
dateshift => $env{'form.dateshift'}, |
|
tinyurls => $env{'form.tinyurls'}, |
sectotal => $sectotal, |
sectotal => $sectotal, |
sections => \%sections, |
sections => \%sections, |
crosslisttotal => $crosslisttotal, |
crosslisttotal => $crosslisttotal, |
Line 3580 sub print_request_outcome {
|
Line 3730 sub print_request_outcome {
|
accessend => $accessend, |
accessend => $accessend, |
personnel => \%personnel, |
personnel => \%personnel, |
}; |
}; |
my ($result,$output) = &process_request($dom,$cnum,$crstype,$now,$details,$instcode, |
my ($result,$output,$customized) = &process_request($r,$lonhost,$dom,$cnum,$crstype,$now,$details, |
$req_notifylist,\@instsections,\%domconfig); |
$instcode,$req_notifylist,\@instsections,\%domconfig); |
return ($result,$output); |
return ($result,$output,$customized); |
} |
} |
|
|
sub process_request { |
sub process_request { |
my ($dom,$cnum,$crstype,$now,$details,$instcode,$req_notifylist,$instsections,$domconfig) = @_; |
my ($r,$lonhost,$dom,$cnum,$crstype,$now,$details,$instcode,$req_notifylist,$instsections, |
my (@inststatuses,$storeresult,$creationresult,$output); |
$domconfig) = @_; |
|
my (@inststatuses,$storeresult,$creationresult,$output,$customized); |
my $val = |
my $val = |
&Apache::loncoursequeueadmin::get_processtype('course',$env{'user.name'}, |
&Apache::loncoursequeueadmin::get_processtype('course',$env{'user.name'}, |
$env{'user.domain'},$env{'user.adv'}, |
$env{'user.domain'},$env{'user.adv'}, |
Line 3601 sub process_request {
|
Line 3752 sub process_request {
|
$output = &mt('You are not permitted to request creation of communities'); |
$output = &mt('You are not permitted to request creation of communities'); |
} elsif ($crstype eq 'textbook') { |
} elsif ($crstype eq 'textbook') { |
$output = &mt('You are not permitted to request creation of textbook courses'); |
$output = &mt('You are not permitted to request creation of textbook courses'); |
|
} elsif ($crstype eq 'placement') { |
|
$output = &mt('You are not permitted to request creation of placement tests'); |
} else { |
} else { |
$output = &mt('Unrecognized course type: [_1]',$crstype); |
$output = &mt('Unrecognized course type: [_1]',$crstype); |
} |
} |
$storeresult = 'notpermitted'; |
$storeresult = 'notpermitted'; |
} else { |
} else { |
my ($disposition,$message,$reqstatus); |
my ($disposition,$message,$reqstatus,$coursedesc,$accessstart,$accessend,%customvalidation); |
my %reqhash = ( |
my %reqhash = ( |
reqtime => $now, |
reqtime => $now, |
crstype => $crstype, |
crstype => $crstype, |
Line 3614 sub process_request {
|
Line 3767 sub process_request {
|
); |
); |
my $requestkey = $dom.'_'.$cnum; |
my $requestkey = $dom.'_'.$cnum; |
my $validationerror; |
my $validationerror; |
|
my $fullname = &Apache::loncommon::plainname($env{'user.name'}, |
|
$env{'user.domain'}); |
|
if (ref($details) eq 'HASH') { |
|
$coursedesc = $details->{'cdescr'}; |
|
$accessstart = $details->{'accessstart'}; |
|
$accessend = $details->{'accessend'}; |
|
} |
if ($val eq 'autolimit=') { |
if ($val eq 'autolimit=') { |
$disposition = 'process'; |
$disposition = 'process'; |
} elsif ($val =~ /^autolimit=(\d+)$/) { |
} elsif ($val =~ /^autolimit=(\d+)$/) { |
Line 3622 sub process_request {
|
Line 3782 sub process_request {
|
$dom,$crstype,$limit,\$message); |
$dom,$crstype,$limit,\$message); |
} elsif ($val eq 'validate') { |
} elsif ($val eq 'validate') { |
my ($inststatuslist,$validationchk,$validation); |
my ($inststatuslist,$validationchk,$validation); |
|
if (ref($details) eq 'HASH') { |
|
if ($details->{'clonecrs'}) { |
|
$customvalidation{'_LC_clonefrom'} = $details->{'clonedom'}.'_'.$details->{'clonecrs'}; |
|
} |
|
} |
if (@inststatuses > 0) { |
if (@inststatuses > 0) { |
$inststatuslist = join(',',@inststatuses); |
$inststatuslist = join(',',@inststatuses); |
} |
} |
Line 3631 sub process_request {
|
Line 3796 sub process_request {
|
$instseclist = join(',',@{$instsections}); |
$instseclist = join(',',@{$instsections}); |
} |
} |
} |
} |
|
# |
|
# Retrieve any custom form information used for validation |
|
# |
|
my $preprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'prevalidate',$env{'user.name'}, |
|
$env{'user.domain'},$fullname,$coursedesc); |
|
if (ref($preprocess) eq 'HASH') { |
|
&custom_formitems($preprocess,\%customvalidation); |
|
} |
$validationchk = |
$validationchk = |
&Apache::lonnet::auto_courserequest_validation($dom, |
&Apache::lonnet::auto_courserequest_validation($dom, |
$env{'user.name'}.':'.$env{'user.domain'},$crstype, |
$env{'user.name'}.':'.$env{'user.domain'},$crstype, |
$inststatuslist,$instcode,$instseclist); |
$inststatuslist,$instcode,$instseclist,\%customvalidation); |
if ($validationchk =~ /:/) { |
if ($validationchk =~ /:/) { |
($validation,$message) = split(':',$validationchk); |
($validation,$message) = split(':',$validationchk); |
} else { |
} else { |
Line 3651 sub process_request {
|
Line 3824 sub process_request {
|
} |
} |
$reqhash{'disposition'} = $disposition; |
$reqhash{'disposition'} = $disposition; |
$reqstatus = $disposition; |
$reqstatus = $disposition; |
my ($modified,$queued,$coursedesc,%customitems); |
my ($modified,$queued,$token,%customitems); |
unless ($disposition eq 'rejected') { |
unless ($disposition eq 'rejected') { |
if (ref($details) eq 'HASH') { |
|
$coursedesc = $details->{'cdescr'}; |
|
} |
|
my $fullname = &Apache::loncommon::plainname($env{'user.name'}, |
|
$env{'user.domain'}); |
|
my $inprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'process',$env{'user.name'}, |
my $inprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'process',$env{'user.name'}, |
$env{'user.domain'},$fullname,$coursedesc); |
$env{'user.domain'},$fullname,$coursedesc,undef, |
|
undef,undef,\%customvalidation); |
|
# |
|
# Retrieve any custom form information submitted with review page and include in request details. |
|
# |
if (ref($inprocess) eq 'HASH') { |
if (ref($inprocess) eq 'HASH') { |
if (ref($inprocess->{'formitems'}) eq 'HASH') { |
&custom_formitems($inprocess,\%customitems); |
foreach my $key (keys(%{$inprocess->{'formitems'}})) { |
foreach my $key (keys(%customitems)) { |
if ($inprocess->{'formitems'}->{$key} eq 'multiple') { |
$reqhash{'custom'}{$key} = $customitems{$key}; |
if (exists($env{'form.'.$key})) { |
|
@{$customitems{$key}} = &Apache::loncommon::get_env_multiple($env{'form.'.$key}); |
|
} |
|
} else { |
|
if (exists($env{'form.'.$key})) { |
|
$customitems{$key} = $env{'form.'.$key}; |
|
$reqhash{'custom'}{$key} = $customitems{$key}; |
|
} |
|
} |
|
} |
|
} |
} |
} |
} |
} |
} |
Line 3689 sub process_request {
|
Line 3851 sub process_request {
|
$storeresult = 'rejected'; |
$storeresult = 'rejected'; |
} elsif ($disposition eq 'process') { |
} elsif ($disposition eq 'process') { |
my %domdefs = &Apache::lonnet::get_domain_defaults($dom); |
my %domdefs = &Apache::lonnet::get_domain_defaults($dom); |
my ($logmsg,$newusermsg,$addresult,$enrollcount,$response,$keysmsg,%longroles,$code); |
my ($logmsg,$newusermsg,$addresult,$enrollcount,$response, |
|
$keysmsg,%longroles,$code); |
|
my $clonemsg = []; |
my $type = 'Course'; |
my $type = 'Course'; |
if ($crstype eq 'community') { |
if ($crstype eq 'community') { |
$type = 'Community'; |
$type = 'Community'; |
Line 3698 sub process_request {
|
Line 3862 sub process_request {
|
foreach my $role (@roles) { |
foreach my $role (@roles) { |
$longroles{$role}=&Apache::lonnet::plaintext($role,$type); |
$longroles{$role}=&Apache::lonnet::plaintext($role,$type); |
} |
} |
|
my $preamble = '<div id="LC_update" class="LC_info">'. |
|
'<br />'. |
|
&mt("Please be patient while your request is processed"). |
|
'<br /></div>'. |
|
'<div style="padding:0;clear:both;margin:0;border:0"></div>'; |
|
my $closure = <<ENDCLOSE; |
|
<script type="text/javascript"> |
|
// <![CDATA[ |
|
\$("#LC_update").hide('slow'); |
|
// ]]> |
|
</script> |
|
ENDCLOSE |
|
my %prog_state = &Apache::lonhtmlcommon::Create_PrgWin($r,undef,$preamble); |
|
&Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,&mt('Processing ...')); |
|
$r->rflush(); |
|
if (ref($details) eq 'HASH') { |
|
if ($details->{'clonecrs'}) { |
|
$customitems{'_LC_clonefrom'} = $details->{'clonedom'}.'_'.$details->{'clonecrs'}; |
|
} |
|
} |
|
$customitems{'_LC_ownerfullname'} = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'},'first'); |
|
my $owneremail; |
|
my %emails = &Apache::loncommon::getemails(); |
|
foreach my $email ('permanentemail','critnotification','notification') { |
|
$owneremail = $emails{$email}; |
|
last if ($owneremail ne ''); |
|
} |
|
if ($owneremail ne '') { |
|
$customitems{'_LC_owneremail'} = $owneremail; |
|
} |
|
$customitems{'_LC_coursedomainname'} = &Apache::lonnet::domain($dom,'description'); |
|
$customitems{'_LC_coursedescription'} = $coursedesc; |
|
$customitems{'_LC_coursestartdate'} = $accessstart; |
|
$customitems{'_LC_courseenddate'} = $accessend; |
my ($result,$postprocess) = &Apache::loncoursequeueadmin::course_creation($dom,$cnum, |
my ($result,$postprocess) = &Apache::loncoursequeueadmin::course_creation($dom,$cnum, |
'autocreate',$details,\$logmsg,\$newusermsg,\$addresult, |
'autocreate',$details,\$logmsg,$clonemsg,\$newusermsg, |
\$enrollcount,\$response,\$keysmsg,\%domdefs,\%longroles, |
\$addresult,\$enrollcount,\$response,\$keysmsg,\%domdefs, |
\$code,\%customitems); |
\%longroles,\$code,\%customitems); |
|
&Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,&mt('Finished!')); |
|
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); |
|
$r->print($closure); |
|
if (ref($postprocess) eq 'HASH') { |
|
$customized = $postprocess->{'createdcustomized'}; |
|
} |
if ($result eq 'created') { |
if ($result eq 'created') { |
$disposition = 'created'; |
$disposition = 'created'; |
$reqstatus = 'created'; |
$reqstatus = 'created'; |
Line 3715 sub process_request {
|
Line 3919 sub process_request {
|
if (($code) || ((ref($postprocess) eq 'HASH') && |
if (($code) || ((ref($postprocess) eq 'HASH') && |
(($postprocess->{'createdweb'}) || ($postprocess->{'createdmsg'})))) { |
(($postprocess->{'createdweb'}) || ($postprocess->{'createdmsg'})))) { |
$output .= ¬ification_information($disposition,$env{'user.name'}.':'.$env{'user.domain'}, |
$output .= ¬ification_information($disposition,$env{'user.name'}.':'.$env{'user.domain'}, |
$dom,$cnum,$now,$code,$postprocess); |
$dom,$cnum,$now,$code,$postprocess,$crstype); |
} |
} |
if ($code) { |
if ($code) { |
$reqhash{'code'} = $code; |
$reqhash{'code'} = $code; |
} |
} |
$output .= '<br />'.$role_result.'</p>'; |
if (ref($postprocess) eq 'HASH') { |
|
if (ref($postprocess->{'createdactions'}) eq 'HASH') { |
|
if (ref($postprocess->{'createdactions'}{'environment'}) eq 'HASH') { |
|
&Apache::loncoursequeueadmin::postprocess_crsenv($dom,$cnum, |
|
$postprocess->{'createdactions'}{'environment'}); |
|
} |
|
} |
|
} |
|
unless ($customized) { |
|
$output .= '<br />'.$role_result; |
|
} |
|
$output .= '</p>'; |
|
if ($logmsg) { |
|
$output .= '<p>'.$logmsg.'</p>'; |
|
} |
|
if ((ref($clonemsg) eq 'ARRAY') && (@{$clonemsg})) { |
|
$output .= '<p class="LC_info">'; |
|
my $user_lh = &Apache::loncommon::user_lang($env{'user.name'},$env{'user.domain'}); |
|
foreach my $item (@{$clonemsg}) { |
|
if (ref($item) eq 'HASH') { |
|
$output .= &mt_user($user_lh,$item->{mt}, |
|
@{$item->{args}}).'<br />'."\n"; |
|
} |
|
} |
|
$output .= '</p>'."\n"; |
|
} |
$creationresult = 'created'; |
$creationresult = 'created'; |
|
# 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; |
|
} |
|
if ($instcode ne '') { |
|
&Apache::lonnet::devalidate_cache_new('instcats',$dom); |
|
# Update cache of self-cataloging courses on institution's server(s). |
|
if (&Apache::lonnet::shared_institution($dom)) { |
|
unless ($registered_instcats) { |
|
my $handlers = $r->get_handlers('PerlCleanupHandler'); |
|
$r->set_handlers('PerlCleanupHandler' => [\&devalidate_remote_instcats,@{$handlers}]); |
|
$registered_instcats=1; |
|
$modified_dom = $dom; |
|
} |
|
} |
|
} |
} else { |
} else { |
$output = '<span class="LC_error">'; |
$output = '<span class="LC_error">'; |
if ($crstype eq 'community') { |
if ($crstype eq 'community') { |
Line 3742 sub process_request {
|
Line 3989 sub process_request {
|
crstype => $crstype, |
crstype => $crstype, |
ownername => $env{'user.name'}, |
ownername => $env{'user.name'}, |
ownerdom => $env{'user.domain'}, |
ownerdom => $env{'user.domain'}, |
description => $env{'form.cdescr'}, |
description => $env{'form.cdescr'}, |
|
lonhost => $lonhost, |
}, |
}, |
}; |
}; |
if ($crstype eq 'official') { |
if ($crstype eq 'official') { |
Line 3760 sub process_request {
|
Line 4008 sub process_request {
|
if (($queuehash{$cnum.'_approval'} ne '') || |
if (($queuehash{$cnum.'_approval'} ne '') || |
($queuehash{$cnum.'_pending'} ne '')) { |
($queuehash{$cnum.'_pending'} ne '')) { |
$queued = 1; |
$queued = 1; |
|
if (ref($queuehash{$cnum.'_pending'}) eq 'HASH') { |
|
$token = $queuehash{$cnum.'_pending'}{'token'}; |
|
} |
} |
} |
} |
} |
unless ($queued) { |
unless ($queued) { |
|
if (($disposition eq 'pending') && ($crstype ne 'official')) { |
|
my %reqinfo = ( |
|
$cnum.':'.$dom => $now.':'.$env{'user.name'}.':'.$env{'user.domain'}, |
|
); |
|
$token = &Apache::lonnet::tmpput(\%reqinfo,$lonhost); |
|
$request->{$requestid}->{'token'} = $token; |
|
} |
my $putresult = &Apache::lonnet::newput_dom('courserequestqueue',$request, |
my $putresult = &Apache::lonnet::newput_dom('courserequestqueue',$request, |
$dom); |
$dom); |
if ($putresult eq 'ok') { |
if ($putresult eq 'ok') { |
Line 3771 sub process_request {
|
Line 4029 sub process_request {
|
} else { |
} else { |
$output .= &mt('Your course request has been recorded.') |
$output .= &mt('Your course request has been recorded.') |
} |
} |
$output .= '<br />'. |
unless ($disposition eq 'pending') { |
¬ification_information($disposition,$req_notifylist, |
$output .= '<br />'. |
$dom,$cnum,$now); |
¬ification_information($disposition,$req_notifylist, |
|
$dom,$cnum,$now,'','',$crstype); |
|
} |
} else { |
} else { |
$reqstatus = 'domainerror'; |
$reqstatus = 'domainerror'; |
$reqhash{'disposition'} = $disposition; |
$reqhash{'disposition'} = $disposition; |
Line 3785 sub process_request {
|
Line 4045 sub process_request {
|
($storeresult,my $updateresult) = |
($storeresult,my $updateresult) = |
&Apache::loncoursequeueadmin::update_coursereq_status(\%reqhash,$dom, |
&Apache::loncoursequeueadmin::update_coursereq_status(\%reqhash,$dom, |
$cnum,$reqstatus,'request',$env{'user.domain'},$env{'user.name'}); |
$cnum,$reqstatus,'request',$env{'user.domain'},$env{'user.name'}); |
if ($modified && $queued && $storeresult eq 'ok') { |
if ($storeresult eq 'ok') { |
if ($crstype eq 'community') { |
my $postprocess; |
$output .= '<p>'.&mt('Your community request has been updated').'</p>'; |
if (($disposition eq 'approval') || ($disposition eq 'pending')) { |
} else { |
my $updateaction = $disposition; |
$output .= '<p>'.&mt('Your course request has been updated').'</p>'; |
if ($disposition eq 'approval') { |
} |
$updateaction = 'queued'; |
$output .= ¬ification_information($disposition,$req_notifylist,$dom,$cnum,$now); |
} |
if ($disposition eq 'approval') { |
|
my $fullname = &Apache::loncommon::plainname($env{'user.name'}, |
my $fullname = &Apache::loncommon::plainname($env{'user.name'}, |
$env{'user.domain'}); |
$env{'user.domain'}); |
my $postprocess = |
$postprocess = |
&Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'queued',$env{'user.name'}, |
&Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,$updateaction,$env{'user.name'}, |
$env{'user.domain'},$fullname,$env{'form.cdescr'}); |
$env{'user.domain'},$fullname,$env{'form.cdescr'}); |
|
} |
|
if ($modified && $queued) { |
|
if ($crstype eq 'community') { |
|
$output .= '<p>'.&mt('Your community request has been updated').'</p>'; |
|
} else { |
|
$output .= '<p>'.&mt('Your course request has been updated').'</p>'; |
|
} |
|
if ($disposition eq 'approval') { |
|
$output .= ¬ification_information($disposition,$req_notifylist,$dom,$cnum,$now,'','',$crstype); |
|
} |
|
} |
|
if ($disposition eq 'approval') { |
if ((ref($postprocess) eq 'HASH') && |
if ((ref($postprocess) eq 'HASH') && |
((ref($postprocess->{'queuedmsg'}) eq 'HASH') || ($postprocess->{'queuedweb'}))) { |
((ref($postprocess->{'queuedmsg'}) eq 'HASH') || ($postprocess->{'queuedweb'}))) { |
my $recipient = $env{'user.name'}.':'.$env{'user.domain'}; |
¬ification_information($disposition,undef,$dom,$cnum,$now,undef,$postprocess,$crstype); |
$output .= ¬ification_information($disposition,$recipient,$dom,$cnum,$now,undef,$postprocess); |
$customized = $postprocess->{'createdcustomized'}; |
|
} |
|
} elsif ($disposition eq 'pending') { |
|
my $pendingform; |
|
if ($crstype ne 'official') { |
|
$pendingform = &pending_validation_form($r,$dom,$cnum,$crstype,$now,$token, |
|
$lonhost,$env{'form.cdescr'}); |
|
} |
|
if ($pendingform) { |
|
$output .= $pendingform; |
|
} else { |
|
$output .= ¬ification_information($disposition,undef,$dom,$cnum,$now,undef,$postprocess,$crstype); |
|
} |
|
if (ref($postprocess) eq 'HASH') { |
|
$customized = $postprocess->{'createdcustomized'}; |
} |
} |
} |
} |
} |
} |
Line 3813 sub process_request {
|
Line 4098 sub process_request {
|
} |
} |
} |
} |
if ($creationresult ne '') { |
if ($creationresult ne '') { |
return ($creationresult,$output); |
return ($creationresult,$output,$customized); |
} else { |
} else { |
return ($storeresult,$output); |
return ($storeresult,$output,$customized); |
|
} |
|
} |
|
|
|
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; |
|
} |
|
|
|
sub custom_formitems { |
|
my ($preprocess,$customhash) = @_; |
|
return unless ((ref($preprocess) eq 'HASH') && (ref($customhash) eq 'HASH')); |
|
if (ref($preprocess->{'formitems'}) eq 'HASH') { |
|
foreach my $key (keys(%{$preprocess->{'formitems'}})) { |
|
if ($preprocess->{'formitems'}->{$key} eq 'multiple') { |
|
if (exists($env{'form.'.$key})) { |
|
my @items = &Apache::loncommon::get_env_multiple($env{'form.'.$key}); |
|
foreach my $item (@items) { |
|
$item =~ s/(`)/'/g; |
|
$item =~ s/\$/\(\$\)/g; |
|
push(@{$customhash->{$key}},$item); |
|
} |
|
} |
|
} else { |
|
if (exists($env{'form.'.$key})) { |
|
$customhash->{$key} = $env{'form.'.$key}; |
|
$customhash->{$key} =~ s/(`)/'/g; |
|
$customhash->{$key} =~ s/\$/\(\$\)/g; |
|
} |
|
} |
|
} |
} |
} |
} |
} |
|
|
Line 3955 sub update_requestors_roles {
|
Line 4281 sub update_requestors_roles {
|
} |
} |
|
|
sub notification_information { |
sub notification_information { |
my ($disposition,$req_notifylist,$dom,$cnum,$now,$code,$postprocess) = @_; |
my ($disposition,$req_notifylist,$dom,$cnum,$now,$code,$postprocess,$crstype) = @_; |
my %emails = &Apache::loncommon::getemails(); |
my %emails = &Apache::loncommon::getemails(); |
my $address; |
my $address; |
if (($emails{'permanentemail'} ne '') || ($emails{'notification'} ne '')) { |
if (($emails{'permanentemail'} ne '') || ($emails{'notification'} ne '')) { |
Line 3971 sub notification_information {
|
Line 4297 sub notification_information {
|
if ($address ne '') { |
if ($address ne '') { |
$output.= &mt('An e-mail will also be sent to: [_1] when this occurs.',$address).'<br />'; |
$output.= &mt('An e-mail will also be sent to: [_1] when this occurs.',$address).'<br />'; |
} |
} |
|
my %possemails; |
|
my $fullname = &Apache::loncommon::plainname($env{'user.name'}, |
|
$env{'user.domain'}); |
|
my $emailto = &Apache::loncommon::build_recipient_list(undef,'requestsmail',$dom); |
|
if ($emailto) { |
|
map { $possemails{$_} = 1; } (split(/,/,$emailto)); |
|
} |
if ($req_notifylist) { |
if ($req_notifylist) { |
my $fullname = &Apache::loncommon::plainname($env{'user.name'}, |
if ($emailto) { |
$env{'user.domain'}); |
foreach my $recip (split(/,/,$req_notifylist)) { |
|
my ($uname,$udom) = split(/:/,$recip); |
|
my %emails = &Apache::loncommon::getemails($uname,$udom); |
|
foreach my $type ('permanentemail','notification') { |
|
if ((exists($emails{$type})) && ($emails{$type} ne '')) { |
|
my @to = split(/,/,$emails{$type}); |
|
foreach my $addr (@to) { |
|
if (($addr ne '') && ($addr =~ m/\@/)) { |
|
if (exists($possemails{$addr})) { |
|
delete($possemails{$addr}); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
my $sender = $env{'user.name'}.':'.$env{'user.domain'}; |
my $sender = $env{'user.name'}.':'.$env{'user.domain'}; |
&Apache::loncoursequeueadmin::send_selfserve_notification($req_notifylist,"$fullname ($env{'user.name'}:$env{'user.domain'})", |
&Apache::loncoursequeueadmin::send_selfserve_notification($req_notifylist,"$fullname ($env{'user.name'}:$env{'user.domain'})", |
'undef',$env{'form.cdescr'},$now,'coursereq',$sender); |
undef,$env{'form.cdescr'},$now,'coursereq',$sender,'','',$crstype); |
|
} |
|
# |
|
# If domain configuration for "E-mail addresses and helpform" has values set |
|
# for "E-mail from course requests requiring approval", send email to those |
|
# addresse(es) when a course request is queued, pending approval, unless |
|
# the email address will already receive a notification email, because of |
|
# values set for "Receive notification of course requests requiring approval" |
|
# in "Request creation of courses" configuration item. |
|
# |
|
if ($emailto && keys(%possemails)) { |
|
¬ify_admin($dom,$crstype,$env{'form.cdescr'},"$fullname ($env{'user.name'}:$env{'user.domain'})",$now,\%possemails); |
} |
} |
if (ref($postprocess) eq 'HASH') { |
if (ref($postprocess) eq 'HASH') { |
if (ref($postprocess->{'queuedmsg'}) eq 'ARRAY') { |
if (ref($postprocess->{'queuedmsg'}) eq 'ARRAY') { |
Line 3994 sub notification_information {
|
Line 4354 sub notification_information {
|
if (scalar(@{$addmsg}) > 0) { |
if (scalar(@{$addmsg}) > 0) { |
&Apache::loncoursequeueadmin::send_selfserve_notification($recipient,$addmsg,undef, |
&Apache::loncoursequeueadmin::send_selfserve_notification($recipient,$addmsg,undef, |
$env{'form.cdescr'},$now, |
$env{'form.cdescr'},$now, |
'queuedreq',$sender); |
'queuedcrsreq',$sender); |
} |
} |
} |
} |
} |
} |
Line 4003 sub notification_information {
|
Line 4363 sub notification_information {
|
} |
} |
} |
} |
} elsif ($disposition eq 'pending') { |
} elsif ($disposition eq 'pending') { |
$output .= '<div class="LC_info">'. |
my $pending_default = '<div class="LC_info">'. |
&mt('Your request has been placed in a queue pending administrative action.').'<br />'. |
&mt('Your request has been placed in a queue pending administrative action.').'<br />'. |
&mt("Usually this means that your institution's information systems do not list you among the instructional personnel for this course.").'<br />'. |
&mt("Usually this means that your institution's information systems do not list you among the instructional personnel for this course.").'<br />'. |
&mt('The list of instructional personnel for the course will be automatically checked daily, and once you are listed the request will be processed.'). |
&mt('The list of instructional personnel for the course will be automatically checked daily, and once you are listed the request will be processed.'). |
'</div>'; |
'</div>'; |
|
if (ref($postprocess) eq 'HASH') { |
|
if ($postprocess->{'pendingweb'}) { |
|
$output .= $postprocess->{'pendingweb'}; |
|
} else { |
|
$output .= $pending_default; |
|
} |
|
} else { |
|
$output .= $pending_default; |
|
} |
} elsif ($disposition eq 'created') { |
} elsif ($disposition eq 'created') { |
if (($code) || ((ref($postprocess) eq 'HASH') && |
if (($code) || ((ref($postprocess) eq 'HASH') && |
((ref($postprocess->{'createdmsg'}) eq 'ARRAY') || ($postprocess->{'createdweb'})))) { |
((ref($postprocess->{'createdmsg'}) eq 'ARRAY') || ($postprocess->{'createdweb'})))) { |
Line 4043 sub notification_information {
|
Line 4412 sub notification_information {
|
} |
} |
} |
} |
if (scalar(@{$addmsg}) > 0) { |
if (scalar(@{$addmsg}) > 0) { |
my $type = 'createdreq'; |
my $type = 'createdcrsreq'; |
if ($code) { |
if ($code) { |
$type = 'uniquecode'; |
$type = 'uniquecode'; |
} |
} |
&Apache::loncoursequeueadmin::send_selfserve_notification($recipient,$addmsg,$dom.'_'.$cnum,$env{'form.cdescr'}, |
&Apache::loncoursequeueadmin::send_selfserve_notification($recipient,$addmsg,$dom.'_'.$cnum,$env{'form.cdescr'}, |
$now,$type,$sender); |
$now,$type,$sender,'','',$crstype); |
} |
} |
} |
} |
} else { |
} else { |
Line 4059 sub notification_information {
|
Line 4428 sub notification_information {
|
return $output; |
return $output; |
} |
} |
|
|
|
sub notify_admin { |
|
my ($dom,$crstype,$contextdesc,$textstr,$timestamp,$emailsref) = @_; |
|
if ((ref($emailsref) eq 'HASH') && (keys(%{$emailsref}))) { |
|
my $emailto = join(',',sort(keys(%{$emailsref}))); |
|
my (@rawmsg,$rawsubj,$msgtxt); |
|
if ($crstype eq 'community') { |
|
$rawsubj = 'Community request to review'; |
|
$msgtxt = 'Creation of the following community: [_1]was requested by [_2] on [_3].'; |
|
} else { |
|
$rawsubj = 'Course request to review'; |
|
$msgtxt = 'Creation of the following course: [_1]was requested by [_2] on [_3].'; |
|
} |
|
$timestamp =&Apache::lonlocal::locallocaltime($timestamp); |
|
push(@rawmsg,{ |
|
mt => $msgtxt, |
|
args => ["\n $contextdesc\n",$textstr,$timestamp], |
|
}, |
|
{ |
|
mt =>'[_1]A Domain Coordinator will use: [_2]Main Menu -> Course and community creation -> Approve or reject requests[_3]to display a list of pending requests, which can either be approved or rejected.', |
|
args => ["\n","\n\n","\n\n"], |
|
}); |
|
|
|
my $sender_lh = &Apache::loncommon::user_lang($env{'user.name'},$env{'user.domain'}); |
|
my $subject = &mt_user($sender_lh,$rawsubj); |
|
my $message = ''; |
|
foreach my $item (@rawmsg) { |
|
if (ref($item) eq 'HASH') { |
|
if (ref($item->{args}) eq 'ARRAY') { |
|
$message .= &mt_user($sender_lh,$item->{mt},@{$item->{args}})."\n"; |
|
} else { |
|
$message .= &mt_user($sender_lh,$item->{mt})."\n"; |
|
} |
|
} |
|
} |
|
my $chgmail = "To: $emailto\n". |
|
"Subject: $subject\n". |
|
"Content-type: text/plain\; charset=UTF-8\n". |
|
"MIME-Version: 1.0\n\n". |
|
"$message\n\n"; |
|
if (open(my $mailh, "|/usr/lib/sendmail -oi -t -odb")) { |
|
print $mailh $chgmail; |
|
close($mailh); |
|
} |
|
} |
|
} |
|
|
|
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 .= '<form name="crsreqvalidation" action="'.$url.'" method="post">'."\n"; |
|
foreach my $field (@fields) { |
|
if ($postvalues{$field}) { |
|
$output .= '<input type="hidden" name="'.$field.'" value="'.$postvalues{$field}.'" />'."\n"; |
|
} |
|
} |
|
if ($buttontext eq '') { |
|
if ($crstype eq 'community') { |
|
$buttontext = &mt('Create community'); |
|
} else { |
|
$buttontext = &mt('Create course'); |
|
} |
|
} |
|
my $hostname = &Apache::lonnet::hostname($lonhost); |
|
my $protocol = $Apache::lonnet::protocol{$lonhost}; |
|
$protocol = 'http' if ($protocol ne 'https'); |
|
my $alias = &Apache::lonnet::use_proxy_alias($r,$lonhost); |
|
$hostname = $alias if ($alias ne ''); |
|
my $crscreator = $protocol.'://'.$hostname.'/cgi-bin/createpending.pl'; |
|
$output .= '<input type="hidden" name="crscreator" value="'.$crscreator.'" />'."\n". |
|
'<input type="hidden" name="token" value="'.$token.'" />'."\n". |
|
'<input type="submit" name="validate" value="'.$buttontext.'" />'."\n". |
|
'</form>'."\n"; |
|
} |
|
} |
|
} |
|
return $output; |
|
} |
|
|
sub check_autolimit { |
sub check_autolimit { |
my ($uname,$udom,$dom,$crstype,$limit,$message) = @_; |
my ($uname,$udom,$dom,$crstype,$limit,$message) = @_; |
my %crsroles = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'}, |
my %crsroles = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'}, |
Line 4073 sub check_autolimit {
|
Line 4538 sub check_autolimit {
|
if (($crstype eq 'community') && |
if (($crstype eq 'community') && |
(exists($crsroles{$cnum.':'.$cdom.':co'}))) { |
(exists($crsroles{$cnum.':'.$cdom.':co'}))) { |
$count ++; |
$count ++; |
} elsif ((($crstype eq 'official') || ($crstype eq 'unofficial') || ($crstype eq 'textbook')) && |
} elsif ((($crstype eq 'official') || ($crstype eq 'unofficial') || ($crstype eq 'textbook') || ($crstype eq 'placement')) && |
(exists($crsroles{$cnum.':'.$cdom.':cc'}))) { |
(exists($crsroles{$cnum.':'.$cdom.':cc'}))) { |
$count ++; |
$count ++; |
} |
} |
Line 4124 sub retrieve_settings {
|
Line 4589 sub retrieve_settings {
|
} |
} |
$env{'form.datemode'} = $reqinfo{'datemode'}; |
$env{'form.datemode'} = $reqinfo{'datemode'}; |
$env{'form.dateshift'} = $reqinfo{'dateshift'}; |
$env{'form.dateshift'} = $reqinfo{'dateshift'}; |
|
$env{'form.tinyurls'} = $reqinfo{'tinyurls'}; |
if ($reqinfo{'crstype'} eq 'official') { |
if ($reqinfo{'crstype'} eq 'official') { |
$env{'form.autoadds'} = $reqinfo{'autoadds'}; |
$env{'form.autoadds'} = $reqinfo{'autoadds'}; |
$env{'form.autodrops'} = $reqinfo{'autodrops'}; |
$env{'form.autodrops'} = $reqinfo{'autodrops'}; |
Line 4275 sub generate_date_items {
|
Line 4741 sub generate_date_items {
|
} |
} |
|
|
sub print_textbook_form { |
sub print_textbook_form { |
my ($r,$dom,$incdoms,$domdefs,$settings,$can_request) = @_; |
my ($r,$dom,$incdoms,$domdefs,$settings,$can_request,$crstype,$formhash) = @_; |
my ($bookshash,%ordered); |
my (%prefab,%ordered,%numprefab); |
my $crstype = 'textbook'; |
if ($crstype eq '') { |
# |
$crstype = 'textbook'; |
# Retrieve list of textbook courses cloneable by user |
} |
# |
# |
my $numbook; |
# Retrieve list of prefabricated courses (textbook courses and templates) cloneable by user |
if (ref($settings) eq 'HASH') { |
# |
$bookshash = $settings->{'textbooks'}; |
foreach my $type ('textbooks','templates') { |
if (ref($bookshash) eq 'HASH') { |
$numprefab{$type} = 0; |
foreach my $item (keys(%{$bookshash})) { |
if (ref($settings) eq 'HASH') { |
my ($clonedom,$clonecrs) = split(/_/,$item); |
$prefab{$type} = $settings->{$type}; |
if (ref($bookshash->{$item}) eq 'HASH') { |
if (ref($prefab{$type}) eq 'HASH') { |
|
foreach my $item (keys(%{$prefab{$type}})) { |
my ($clonedom,$clonecrs) = split(/_/,$item); |
my ($clonedom,$clonecrs) = split(/_/,$item); |
if (&Apache::loncoursequeueadmin::can_clone_course($env{'user.name'}, |
if (ref($prefab{$type}{$item}) eq 'HASH') { |
$env{'user.domain'},$clonecrs,$clonedom,$crstype)) { |
if (&Apache::loncoursequeueadmin::can_clone_course($env{'user.name'}, |
|
$env{'user.domain'},$clonecrs,$clonedom,$crstype,$dom)) { |
my $num = $bookshash->{$item}{'order'}; |
|
$ordered{$num} = $item; |
my $num = $prefab{$type}{$item}{'order'}; |
$numbook ++; |
$ordered{$type}{$num} = $item; |
|
$numprefab{$type} ++; |
|
} |
} |
} |
} |
} |
} |
} |
Line 4312 sub print_textbook_form {
|
Line 4781 sub print_textbook_form {
|
} |
} |
|
|
# |
# |
# Retrieve information about courses owned by user, or in which user has an active or future |
# Retrieve information about courses owned by user, or in which user has an active |
# Course Coordinator role |
# Course Coordinator role |
# |
# |
my $numcurrent; |
my $numcurrent; |
my %cloneable = &Apache::lonnet::courseiddump($dom,'.',1,'.',$env{'user.name'}.':'.$env{'user.domain'}, |
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', |
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)) { |
foreach my $role (keys(%ccroles)) { |
my ($cnum,$cdom,$rest) = split(/:/,$role,3); |
my ($cnum,$cdom,$rest) = split(/:/,$role,3); |
|
$cc_clone .= $cdom.':'.$cnum.'&'; |
unless (exists($cloneable{$cdom.'_'.$cnum})) { |
unless (exists($cloneable{$cdom.'_'.$cnum})) { |
my %courseinfo = &Apache::lonnet::coursedescription($cdom.'_'.$cnum,{'one_time' => 1}); |
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 $numcurrent = scalar(keys(%cloneable)); |
|
|
my $jscript = &textbook_request_javascript($numbook,$numcurrent); |
# |
my %loaditems; |
# Retrieve information about courses from user's domain which user can clone, but which not owned |
$loaditems{'onload'} = 'javascript:uncheckAllRadio();'; |
# or cloneable based on Course Coordinator role. |
$r->print(&header('Course Request',$jscript,\%loaditems)); |
# |
|
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,$args); |
|
$loaditems{'onload'} = 'javascript:uncheckAllRadio();'.$customonload; |
|
if ($crstype eq 'lti') { |
|
$args = { 'only_body' => 1}; |
|
} |
|
$r->print(&header('Course Request',$jscript,\%loaditems,undef,$args)); |
|
|
if (ref($can_request) eq 'HASH') { |
if (ref($can_request) eq 'HASH') { |
unless ((scalar(keys(%{$can_request})) == 1) && ($can_request->{'textbook'})) { |
unless (((scalar(keys(%{$can_request})) == 1) && ($can_request->{'textbook'})) || |
|
($crstype eq 'lti')) { |
&Apache::lonhtmlcommon::add_breadcrumb( |
&Apache::lonhtmlcommon::add_breadcrumb( |
{ href => '/adm/requestcourse', |
{ href => '/adm/requestcourse', |
text => 'Pick action', |
text => 'Pick action', |
}); |
}); |
} |
} |
} |
} |
&Apache::lonhtmlcommon::add_breadcrumb({text=>'Course Request'}); |
unless ($crstype eq 'lti') { |
$r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests')); |
&Apache::lonhtmlcommon::add_breadcrumb({text=>'Course Request'}); |
|
$r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests')); |
|
|
&startContentScreen($r,'textbookrequests'); |
&startContentScreen($r,'textbookrequests'); |
# |
# |
# Show domain selector form, if required. |
# Show domain selector form, if required. |
# |
# |
if (@{$incdoms} > 1) { |
if (@{$incdoms} > 1) { |
my $onchange = 'this.form.submit()'; |
my $onchange = 'this.form.submit()'; |
$r->print('<form name="domforcourse" method="post" action="/adm/requestcourse">'. |
$r->print('<form name="domforcourse" method="post" action="/adm/requestcourse">'. |
'<div><fieldset><legend>'.&mt('Domain').'</legend>'. |
'<div><fieldset><legend>'.&mt('Domain').'</legend>'. |
&Apache::loncommon::select_dom_form($dom,'showdom','',1,$onchange,$incdoms). |
&Apache::loncommon::select_dom_form($dom,'showdom','',1,$onchange,$incdoms). |
'</fieldset></form>'); |
'</fieldset></form>'); |
|
} |
} |
} |
|
|
# |
# |
Line 4377 sub print_textbook_form {
|
Line 4914 sub print_textbook_form {
|
# |
# |
# Content source selection, if more than one available |
# Content source selection, if more than one available |
# |
# |
if (keys(%cloneable) || keys(%ordered)) { |
if (keys(%cloneable) || keys(%ordered) || keys(%domcloneable)) { |
$r->print('<div>'. |
$r->print('<div>'. |
'<fieldset><legend>'.&mt('Course Content').'</legend>'); |
'<fieldset><legend>'.&mt('Course Content').'</legend>'); |
if (keys(%ordered)) { |
if (keys(%ordered)) { |
$r->print('<span class="LC_nobreak"><label>'. |
if (ref($ordered{'textbooks'}) eq 'HASH') { |
'<input type="radio" name="cloning" value="textbook" onclick="javascript:cloneChoice();" />'. |
$r->print('<span class="LC_nobreak"><label>'. |
&mt('Load textbook content').'</span>'.(' 'x2).' '); |
'<input type="radio" name="cloning" value="textbook" onclick="javascript:cloneChoice();" />'. |
|
&mt('Load textbook content').'</span>'.(' 'x2).' '); |
|
} |
|
if (ref($ordered{'templates'}) eq 'HASH') { |
|
$r->print('<span class="LC_nobreak"><label>'. |
|
'<input type="radio" name="cloning" value="template" onclick="javascript:cloneChoice();" />'. |
|
&mt('Load pre-existing template').'</span>'.(' 'x2).' '); |
|
} |
} |
} |
if (keys(%cloneable)) { |
if (keys(%cloneable)) { |
$r->print('<span class="LC_nobreak"><label>'. |
$r->print('<span class="LC_nobreak"><label>'. |
'<input type="radio" name="cloning" value="existing" onclick="javascript:cloneChoice();" />'. |
'<input type="radio" name="cloning" value="existing" onclick="javascript:cloneChoice();" />'. |
&mt('Copy one of your courses').'</label></span>'.(' 'x2).' '); |
&mt('Copy one of your courses').'</label></span>'.(' 'x2).' '); |
} |
} |
|
if (keys(%domcloneable)) { |
|
$r->print('<span class="LC_nobreak"><label>'. |
|
'<input type="radio" name="cloning" value="colleague" onclick="javascript:cloneChoice();" />'. |
|
&mt("Copy a colleague's course").'</label></span>'.(' 'x2).' '); |
|
} |
$r->print('<span class="LC_nobreak"><label>'. |
$r->print('<span class="LC_nobreak"><label>'. |
'<input type="radio" name="cloning" value="none" checked="checked" onclick="javascript:cloneChoice();" />'. |
'<input type="radio" name="cloning" value="none" checked="checked" onclick="javascript:cloneChoice();" />'. |
&mt('Empty course shell').'</label></span>'); |
&mt('Empty course shell').'</label></span>'); |
Line 4401 sub print_textbook_form {
|
Line 4950 sub print_textbook_form {
|
# Table of cloneable textbook courses |
# Table of cloneable textbook courses |
# |
# |
if (keys(%ordered)) { |
if (keys(%ordered)) { |
$r->print('<div id="showtextbook" style="display:none">'. |
foreach my $type ('textbooks','templates') { |
&Apache::loncommon::start_data_table(). |
my $divid = 'showtextbook'; |
&Apache::loncommon::start_data_table_header_row(). |
my $radioid = 'book'; |
'<th>'.&mt('Title').'</th>'. |
if ($type eq 'templates') { |
'<th>'.&mt('Author(s)').'</th>'. |
$divid = 'showtemplate'; |
'<th>'.&mt('Subject').'</th>'. |
$radioid = 'template'; |
'<th>'.&mt('Book').'</th>'. |
} |
&Apache::loncommon::end_data_table_header_row()); |
if (ref($ordered{$type}) eq 'HASH') { |
my @items = sort { $a <=> $b } keys(%ordered); |
$r->print('<div id="'.$divid.'" style="display:none">'. |
foreach my $num (@items) { |
&Apache::loncommon::start_data_table(). |
my $item = $ordered{$num}; |
&Apache::loncommon::start_data_table_header_row(). |
my $cleantitle=&HTML::Entities::encode($bookshash->{$item}->{'title'},'<>&"'); |
'<th>'.&mt('Title').'</th>'); |
$cleantitle=~s/'/\\'/g; |
if ($type eq 'textbooks') { |
$cleantitle =~ s/^\s+//; |
$r->print('<th>'.&mt('Author(s)').'</th>'); |
$r->print(&Apache::loncommon::start_data_table_row(). |
} |
'<td><label><input type="radio" name="book" value="'.$item.'" />'. |
$r->print('<th>'.&mt('Subject').'</th>'); |
$cleantitle.'</label></td>'. |
if ($type eq 'textbooks') { |
'<td>'.$bookshash->{$item}->{'author'}.'</td>'. |
$r->print('<th>'.&mt('Publisher').'</th>'. |
'<td>'.$bookshash->{$item}->{'subject'}.'</td>'. |
'<th>'.&mt('Book').'</th>'); |
'<td><img border="0" src="'.$bookshash->{$item}->{'image'}. |
} |
'" alt="'.$cleantitle.'" /></td>'. |
$r->print(&Apache::loncommon::end_data_table_header_row()); |
&Apache::loncommon::end_data_table_row()); |
my @items = sort { $a <=> $b } keys(%{$ordered{$type}}); |
|
foreach my $num (@items) { |
|
my $item = $ordered{$type}{$num}; |
|
my $cleantitle=&HTML::Entities::encode($prefab{$type}{$item}{'title'},'<>&"'); |
|
$cleantitle=~s/'/\\'/g; |
|
$cleantitle =~ s/^\s+//; |
|
$r->print(&Apache::loncommon::start_data_table_row(). |
|
'<td><label><input type="radio" name="'.$radioid.'" value="'.$item.'" />'. |
|
$cleantitle.'</label></td>'); |
|
if ($type eq 'textbooks') { |
|
$r->print('<td>'.$prefab{$type}{$item}{'author'}.'</td>'); |
|
} |
|
$r->print('<td>'.$prefab{$type}{$item}{'subject'}.'</td>'); |
|
if ($type eq 'textbooks') { |
|
$r->print('<td>'.$prefab{$type}{$item}{'publisher'}.'</td>'. |
|
'<td><img border="0" src="'.$prefab{$type}{$item}{'image'}. |
|
'" alt="'.$cleantitle.'" /></td>'); |
|
} |
|
$r->print(&Apache::loncommon::end_data_table_row()); |
|
} |
|
$r->print(&Apache::loncommon::end_data_table(). |
|
'</div>'); |
|
} |
} |
} |
$r->print(&Apache::loncommon::end_data_table(). |
|
'</div>'); |
|
} |
} |
|
|
# |
# |
# Table of user's current courses (owner and/or course coordinator) |
# Table of user's current courses (owner and/or course coordinator) |
# |
# |
|
my %lt = &clone_text('Course'); |
if (keys(%cloneable)) { |
if (keys(%cloneable)) { |
my %lt = &clone_text(); |
|
$r->print('<div id="showexisting" style="display:none">'. |
$r->print('<div id="showexisting" style="display:none">'. |
&Apache::loncommon::start_data_table(). |
&clone_selection_table($dom,'owned',\%cloneable). |
&Apache::loncommon::start_data_table_header_row(). |
'<fieldset style="display:inline-block"><legend>'.$lt{'dsh'}.'</legend><label>'. |
'<th>'.&mt('Title').'</th>'. |
'<input type="radio" name="owndatemode" value="delete" /> '.$lt{'ncd'}. |
'<th>'.&mt('Owner/co-owner(s)').'</th>'. |
'</label><br /><label>'. |
&Apache::loncommon::end_data_table_header_row()); |
'<input type="radio" name="owndatemode" value="preserve" /> '.$lt{'prd'}. |
my %allownernames; |
'</label><br /><label>'. |
my %sortbytitle; |
'<input type="radio" name="owndatemode" value="shift" checked="checked" /> '. |
foreach my $cid (sort(keys(%cloneable))) { |
$lt{'shd'}.'</label>'. |
if (ref($cloneable{$cid}) eq 'HASH') { |
'<input type="text" size="5" name="owndateshift" value="364" />'. |
my $cdesc = $cloneable{$cid}{'description'}; |
'</fieldset><fieldset style="display:inline-block">'. |
$cdesc =~ s/`/'/g; |
'<legend>'.$lt{'dpl'}.'</legend><label>'. |
if ($cdesc ne '') { |
'<input type="radio" name="owntinyurls" value="delete" />'.$lt{'nsl'}. |
push(@{$sortbytitle{$cdesc}},$cid); |
'</label><br /><label>'. |
} |
'<input type="radio" name="owntinyurls" value="transfer" />'.$lt{'tsl'}. |
} |
'</label><br /><label>'. |
} |
'<input type="radio" name="owntinyurls" value="create" checked="checked" />'.$lt{'csl'}. |
foreach my $title (sort(keys(%sortbytitle))) { |
'</label></fieldset>'. |
if (ref($sortbytitle{$title}) eq 'ARRAY') { |
'</div>'); |
foreach my $cid (sort(@{$sortbytitle{$title}})) { |
} |
my $cleantitle=&HTML::Entities::encode($title,'<>&"'); |
# |
$cleantitle=~s/'/\\'/g; |
# Table of other cloneable courses from user's domain (exclude own courses) |
$cleantitle =~ s/^\s+//; |
# |
my ($namestr,@owners,%ownernames); |
if (keys(%domcloneable)) { |
my $singleowner = $cloneable{$cid}{'internal.courseowner'}; |
$r->print('<div id="showcolleague" style="display:none">'. |
push(@owners,$singleowner); |
&clone_selection_table($dom,'colleague',\%domcloneable). |
if ($cloneable{$cid}{'co-owners'} ne '') { |
'<fieldset style="display:inline-block"><legend>'.$lt{'dsh'}.'</legend><label>'. |
foreach my $item (split(/,/,$cloneable{$cid}{'internal.co-owners'})) { |
'<input type="radio" name="colldatemode" value="delete" /> '.$lt{'ncd'}. |
push(@owners,$item); |
'</label><br /><label>'. |
} |
'<input type="radio" name="colldatemode" value="preserve" /> '.$lt{'prd'}. |
} |
'</label><br /><label>'. |
foreach my $owner (@owners) { |
'<input type="radio" name="colldatemode" value="shift" checked="checked" /> '. |
my ($ownername,$ownerdom); |
$lt{'shd'}.'</label>'. |
if ($owner =~ /:/) { |
'<input type="text" size="5" name="colldateshift" value="364" />'. |
($ownername,$ownerdom) = split(/:/,$owner); |
'</fieldset><fieldset style="display:inline-block">'. |
} else { |
'<legend>'.$lt{'dpl'}.'</legend><label>'. |
$ownername = $owner; |
'<input type="radio" name="colltinyurls" value="delete" />'.$lt{'nsl'}. |
if ($owner ne '') { |
'</label><br /><label>'. |
$ownerdom = $dom; |
'<input type="radio" name="colltinyurls" value="create" checked="checked" />'.$lt{'csl'}. |
} |
'</label></fieldset>'. |
} |
'</div>'); |
if ($ownername ne '' && $ownerdom ne '') { |
|
if (exists($allownernames{$ownername.':'.$ownerdom})) { |
|
$ownernames{$ownername.':'.$ownerdom} = $allownernames{$ownername.':'.$ownerdom}; |
|
} else { |
|
my %namehash=&Apache::loncommon::getnames($ownername,$ownerdom); |
|
$ownernames{$ownername.':'.$ownerdom} = \%namehash; |
|
$allownernames{$ownername.':'.$ownerdom} = $ownernames{$ownername.':'.$ownerdom}; |
|
} |
|
} |
|
} |
|
my @lastnames; |
|
foreach my $owner (keys(%ownernames)) { |
|
if (ref($ownernames{$owner}) eq 'HASH') { |
|
push(@lastnames,$ownernames{$owner}{'lastname'}); |
|
} |
|
} |
|
if (@lastnames) { |
|
$namestr = join(', ',sort(@lastnames)); |
|
} |
|
$r->print(&Apache::loncommon::start_data_table_row(). |
|
'<td><label><input type="radio" name="owned" value="'.$cid.'" />'. |
|
' '.$cleantitle.'</label></td>'. |
|
'<td>'.$namestr.'</td>'. |
|
&Apache::loncommon::end_data_table_row()); |
|
} |
|
} |
|
} |
|
$r->print(&Apache::loncommon::end_data_table(). |
|
'<p><input type="radio" name="datemode" value="delete" /> '.$lt{'ncd'}. |
|
'</label><br /><label>'. |
|
'<input type="radio" name="datemode" value="preserve" /> '.$lt{'prd'}. |
|
'</label><br /><label>'. |
|
'<input type="radio" name="datemode" value="shift" checked="checked" /> '. |
|
$lt{'shd'}.'</label>'. |
|
'<input type="text" size="5" name="dateshift" value="365" />'. |
|
'</div>'); |
|
} |
} |
|
|
# |
# |
# End of content selector |
# End of content selector |
# |
# |
if (keys(%cloneable) || keys(%ordered)) { |
if (keys(%cloneable) || keys(%domcloneable) || keys(%ordered)) { |
$r->print('</fieldset></div>'); |
$r->print('</fieldset></div>'); |
} |
} |
|
|
Line 4545 sub print_textbook_form {
|
Line 5079 sub print_textbook_form {
|
# |
# |
# Display any custom fields for this course type |
# Display any custom fields for this course type |
# |
# |
my $fullname = &Apache::loncommon::plainname($env{'user.name'}, |
|
$env{'user.domain'}); |
|
my $postprocess = &Apache::lonnet::auto_crsreq_update($dom,undef,$crstype,'review', |
|
$env{'user.name'}, |
|
$env{'user.domain'},$fullname); |
|
if (ref($postprocess) eq 'HASH') { |
if (ref($postprocess) eq 'HASH') { |
if ($postprocess->{'reviewweb'}) { |
if ($postprocess->{'reviewweb'}) { |
$r->print($postprocess->{'reviewweb'}); |
$r->print($postprocess->{'reviewweb'}); |
Line 4559 sub print_textbook_form {
|
Line 5088 sub print_textbook_form {
|
# |
# |
# Submit button |
# Submit button |
# |
# |
$r->print('<input type="hidden" name="crstype" value="textbook" />'. |
$r->print('<input type="hidden" name="crstype" value="'.$crstype.'" />'. |
'<input type="hidden" name="action" value="process" />'. |
'<input type="hidden" name="action" value="process" />'. |
'<input type="submit" value="'.&mt('Create course').'" />'); |
'<input type="submit" value="'.&mt('Create course').'" />'); |
|
|
# |
# |
# End request form |
# End request form |
# |
# |
|
|
|
if (($crstype eq 'lti') && (ref($formhash) eq 'HASH')) { |
|
foreach my $item (keys(%{$formhash})) { |
|
$r->print('<input type="hidden" name="'.$item.'" value="'.$formhash->{$item}.'" />'."\n"); |
|
} |
|
} |
|
|
$r->print('</form>'); |
$r->print('</form>'); |
&endContentScreen($r). |
unless ($crstype eq 'lti') { |
|
&endContentScreen($r); |
|
} |
$r->print(&Apache::loncommon::end_page()); |
$r->print(&Apache::loncommon::end_page()); |
return; |
return; |
} |
} |
|
|
|
sub clone_selection_table { |
|
my ($dom,$name,$cloneableref) = @_; |
|
return unless ((ref($cloneableref) eq 'HASH') && (($name eq 'owned') || ($name eq 'colleague'))); |
|
my %allownernames; |
|
my %sortbytitle; |
|
my $output; |
|
foreach my $cid (sort(keys(%{$cloneableref}))) { |
|
if (ref($cloneableref->{$cid}) eq 'HASH') { |
|
my $cdesc = $cloneableref->{$cid}{'description'}; |
|
$cdesc =~ s/`/'/g; |
|
if ($cdesc ne '') { |
|
push(@{$sortbytitle{$cdesc}},$cid); |
|
} |
|
} |
|
} |
|
foreach my $title (sort(keys(%sortbytitle))) { |
|
if (ref($sortbytitle{$title}) eq 'ARRAY') { |
|
foreach my $cid (sort(@{$sortbytitle{$title}})) { |
|
my $cleantitle=&HTML::Entities::encode($title,'<>&"'); |
|
$cleantitle=~s/'/\\'/g; |
|
$cleantitle =~ s/^\s+//; |
|
my ($namestr,@owners,%ownernames); |
|
if ($cloneableref->{$cid}{'owner'} ne '') { |
|
push(@owners,$cloneableref->{$cid}{'owner'}); |
|
} |
|
if ($cloneableref->{$cid}{'co-owners'} ne '') { |
|
foreach my $item (split(/,/,$cloneableref->{$cid}{'co-owners'})) { |
|
if (($item ne '') && (!grep(/^\Q$item\E$/,@owners))) { |
|
push(@owners,$item); |
|
} |
|
} |
|
} |
|
foreach my $owner (@owners) { |
|
my ($ownername,$ownerdom); |
|
if ($owner =~ /:/) { |
|
($ownername,$ownerdom) = split(/:/,$owner); |
|
} else { |
|
$ownername = $owner; |
|
if ($owner ne '') { |
|
$ownerdom = $dom; |
|
} |
|
} |
|
if ($ownername ne '' && $ownerdom ne '') { |
|
if (exists($allownernames{$ownername.':'.$ownerdom})) { |
|
$ownernames{$ownername.':'.$ownerdom} = $allownernames{$ownername.':'.$ownerdom}; |
|
} else { |
|
my %namehash=&Apache::loncommon::getnames($ownername,$ownerdom); |
|
$ownernames{$ownername.':'.$ownerdom} = \%namehash; |
|
$allownernames{$ownername.':'.$ownerdom} = $ownernames{$ownername.':'.$ownerdom}; |
|
} |
|
} |
|
} |
|
my @lastnames; |
|
foreach my $owner (keys(%ownernames)) { |
|
if (ref($ownernames{$owner}) eq 'HASH') { |
|
push(@lastnames,$ownernames{$owner}{'lastname'}); |
|
} |
|
} |
|
if (@lastnames) { |
|
$namestr = join(', ',sort(@lastnames)); |
|
} |
|
$output .= &Apache::loncommon::start_data_table_row(). |
|
'<td><label><input type="radio" name="'.$name.'" value="'.$cid.'" />'. |
|
' '.$cleantitle.'</label></td>'. |
|
'<td>'.$namestr.'</td>'. |
|
&Apache::loncommon::end_data_table_row(); |
|
} |
|
} |
|
} |
|
if ($output) { |
|
return &Apache::loncommon::start_data_table(). |
|
&Apache::loncommon::start_data_table_header_row(). |
|
'<th>'.&mt('Title').'</th>'. |
|
'<th>'.&mt('Owner/co-owner(s)').'</th>'. |
|
&Apache::loncommon::end_data_table_header_row(). |
|
$output. |
|
&Apache::loncommon::end_data_table(); |
|
} |
|
return; |
|
} |
|
|
sub process_textbook_request { |
sub process_textbook_request { |
my ($r,$dom,$action,$domdefs,$domconfig,$can_request) = @_; |
my ($r,$dom,$action,$domdefs,$domconfig,$can_request,$crstype) = @_; |
my ($uniquecode,$req_notifylist); |
my ($uniquecode,$req_notifylist); |
my $crstype = 'textbook'; |
if ($crstype eq '') { |
|
$crstype = 'textbook'; |
|
} |
if (ref($domconfig) eq 'HASH') { |
if (ref($domconfig) eq 'HASH') { |
if (ref($domconfig->{'requestcourses'}) eq 'HASH') { |
if (ref($domconfig->{'requestcourses'}) eq 'HASH') { |
if (ref($domconfig->{'requestcourses'}{'notify'}) eq 'HASH') { |
if (ref($domconfig->{'requestcourses'}{'notify'}) eq 'HASH') { |
Line 4586 sub process_textbook_request {
|
Line 5207 sub process_textbook_request {
|
} |
} |
} |
} |
} |
} |
my $crstype = 'textbook'; |
|
my $now = time; |
my $now = time; |
my $reqtype = $env{'form.cloning'}; |
my $reqtype = $env{'form.cloning'}; |
my (@inststatuses,$storeresult,$creationresult); |
my (@inststatuses,$storeresult,$creationresult); |
Line 4594 sub process_textbook_request {
|
Line 5214 sub process_textbook_request {
|
my ($clonefrom,$clonedom,$clonecrs); |
my ($clonefrom,$clonedom,$clonecrs); |
if ($reqtype eq 'textbook') { |
if ($reqtype eq 'textbook') { |
$clonefrom = $env{'form.book'}; |
$clonefrom = $env{'form.book'}; |
|
} elsif ($reqtype eq 'template') { |
|
$clonefrom = $env{'form.template'}; |
} elsif ($reqtype eq 'existing') { |
} elsif ($reqtype eq 'existing') { |
$clonefrom = $env{'form.owned'}; |
$clonefrom = $env{'form.owned'}; |
|
} elsif ($reqtype eq 'colleague') { |
|
$clonefrom = $env{'form.colleague'}; |
} |
} |
my ($accessstart,$accessend) = &dates_from_form('accessstart','accessend'); |
my ($accessstart,$accessend) = &dates_from_form('accessstart','accessend'); |
if ($clonefrom) { |
if ($clonefrom) { |
Line 4603 sub process_textbook_request {
|
Line 5227 sub process_textbook_request {
|
if (&Apache::lonnet::homeserver($clonecrs,$clonedom) ne 'no_host') { |
if (&Apache::lonnet::homeserver($clonecrs,$clonedom) ne 'no_host') { |
my $canclone = |
my $canclone = |
&Apache::loncoursequeueadmin::can_clone_course($env{'user.name'}, |
&Apache::loncoursequeueadmin::can_clone_course($env{'user.name'}, |
$env{'user.domain'},$clonecrs,$clonedom,$crstype); |
$env{'user.domain'},$clonecrs,$clonedom,$crstype,$dom); |
unless ($canclone) { |
unless ($canclone) { |
undef($clonecrs); |
undef($clonecrs); |
undef($clonedom); |
undef($clonedom); |
Line 4613 sub process_textbook_request {
|
Line 5237 sub process_textbook_request {
|
undef($clonedom); |
undef($clonedom); |
} |
} |
} |
} |
$r->print(&header('Course Creation')); |
my $args; |
|
if ($crstype eq 'lti') { |
if (ref($can_request) eq 'HASH') { |
$args = { 'only_body' => 1}; |
unless ((scalar(keys(%{$can_request})) == 1) && ($can_request->{'textbook'})) { |
} |
&Apache::lonhtmlcommon::add_breadcrumb( |
$r->print(&header('Course Creation','','',undef,$args)); |
{ href => '/adm/requestcourse', |
|
text => 'Pick action', |
unless ($crstype eq 'lti') { |
}); |
if (ref($can_request) eq 'HASH') { |
|
unless ((scalar(keys(%{$can_request})) == 1) && ($can_request->{'textbook'})) { |
|
&Apache::lonhtmlcommon::add_breadcrumb( |
|
{ href => '/adm/requestcourse', |
|
text => 'Pick action', |
|
}); |
|
} |
} |
} |
|
&Apache::lonhtmlcommon::add_breadcrumb( |
|
{ href => '/adm/requestcourse', |
|
text => "Create Course", |
|
} |
|
); |
|
&Apache::lonhtmlcommon::add_breadcrumb({text=>'Request Processed'}); |
|
$r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests')); |
|
&startContentScreen($r,'textbookrequests'); |
} |
} |
&Apache::lonhtmlcommon::add_breadcrumb( |
|
{ href => '/adm/requestcourse', |
|
text => "Create Course", |
|
} |
|
); |
|
&Apache::lonhtmlcommon::add_breadcrumb({text=>'Request Processed'}); |
|
$r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests')); |
|
&startContentScreen($r,'textbookrequests'); |
|
|
|
my $details = { |
my $details = { |
owner => $env{'user.name'}, |
owner => $env{'user.name'}, |
Line 4647 sub process_textbook_request {
|
Line 5277 sub process_textbook_request {
|
accessend => $accessend, |
accessend => $accessend, |
personnel => {}, |
personnel => {}, |
}; |
}; |
if ($reqtype eq 'existing') { |
if (($clonecrs ne '') && ($clonedom ne '')) { |
$details->{datemode} = $env{'form.datemode'}; |
if ($reqtype eq 'existing') { |
$details->{dateshift} = $env{'form.dateshift'}; |
$details->{datemode} = $env{'form.owndatemode'}; |
} |
if ($details->{datemode} eq 'shift') { |
my ($result,$output) = &process_request($dom,$cnum,$crstype,$now,$details,'',$req_notifylist,[],$domconfig); |
$details->{dateshift} = $env{'form.owndateshift'}; |
|
} else { |
|
$details->{dateshift} = ''; |
|
} |
|
$details->{tinyurls} = $env{'form.owntinyurls'}; |
|
} elsif ($reqtype eq 'colleague') { |
|
$details->{datemode} = $env{'form.colldatemode'}; |
|
if ($details->{datemode} eq 'shift') { |
|
$details->{dateshift} = $env{'form.colldateshift'}; |
|
} else { |
|
$details->{dateshift} = ''; |
|
} |
|
$details->{tinyurls} = $env{'form.colltinyurls'}; |
|
} elsif (($reqtype eq 'textbook') || ($reqtype eq 'template')) { |
|
$details->{datemode} = 'delete'; |
|
$details->{dateshift} = ''; |
|
$details->{tinyurls} = ''; |
|
} |
|
if ($details->{dateshift} ne '') { |
|
$details->{dateshift} =~ s/[^\d\.]+//g; |
|
} |
|
} else { |
|
$details->{datemode} = ''; |
|
$details->{dateshift} = ''; |
|
$details->{tinyurls} = ''; |
|
} |
|
my $lonhost = $r->dir_config('lonHostID'); |
|
$r->rflush(); |
|
my ($result,$output,$customized) = &process_request($r,$lonhost,$dom,$cnum,$crstype,$now,$details, |
|
'',$req_notifylist,[],$domconfig); |
$r->print($output); |
$r->print($output); |
if (&Apache::loncoursequeueadmin::author_prompt()) { |
if ($crstype eq 'lti') { |
&print_author_prompt($r,$action,$cnum,$dom,$crstype,$result); |
my $storecrs; |
|
if ($env{'request.lti.login'}) { |
|
my %lti = &Apache::lonnet::get_domain_lti($dom,'provider'); |
|
if (ref($lti{$env{'request.lti.login'}}) eq 'HASH') { |
|
$storecrs = $lti{$env{'request.lti.login'}}{'storecrs'}; |
|
} |
|
if ($storecrs) { |
|
my %consumers = &Apache::lonnet::get_dom('lticonsumers',[$env{'form.sourcecrs'}],$dom); |
|
if (($env{'form.lti.sourcecrs'} ne '') && ($consumers{$env{'form.lti.sourcecrs'}} eq '') && ($cnum ne '')) { |
|
&Apache::lonnet::put_dom('lticonsumers',{ $env{'form.lti.sourcecrs'} => $env{'request.lti.login'}.':'.$cnum },$dom); |
|
} |
|
} |
|
} |
|
} elsif (&Apache::loncoursequeueadmin::author_prompt()) { |
|
unless ($customized) { |
|
&print_author_prompt($r,$action,$cnum,$dom,$crstype,$result); |
|
} |
} elsif ($result eq 'created') { |
} elsif ($result eq 'created') { |
$r->print('<p><a href="/adm/requestcourse">'.&mt('Create another course').'</a></p>'); |
unless ($customized) { |
|
$r->print('<p><a href="/adm/requestcourse">'.&mt('Create another course').'</a></p>'); |
|
} |
|
} |
|
unless ($crstype eq 'lti') { |
|
&endContentScreen($r); |
} |
} |
&endContentScreen($r); |
|
$r->print(&Apache::loncommon::end_page()); |
$r->print(&Apache::loncommon::end_page()); |
} |
} |
|
|
sub textbook_request_javascript { |
sub textbook_request_javascript { |
my ($numbook,$numcurrent) = @_; |
my ($numprefab,$numcurrent,$numcolleague,$customvalidationjs) = @_; |
my %lt = &Apache::lonlocal::texthash( |
return unless (ref($numprefab) eq 'HASH'); |
choose => 'Please select a content option.', |
return if (!$numprefab->{'textbooks'} && !$numprefab->{'templates'} && !$numcurrent && !$numcolleague); |
textbook => 'Please select a textbook, or choose a different option.', |
my %js_lt = &Apache::lonlocal::texthash( |
existing => 'Please select one of your existing courses to copy, or choose a different option.', |
choose => 'Please select a content option.', |
title => 'Please enter a course title.', |
textbook => 'Please select a textbook, or choose a different option.', |
|
template => 'Please select a template, or choose a different option.', |
|
existing => 'Please select one of your existing courses to copy, or choose a different option.', |
|
colleague => "Please select a colleague's course to copy, or choose a different option.", |
|
title => 'Please enter a course title.', |
); |
); |
return if (!$numbook && !$numcurrent); |
&js_escape(\%js_lt); |
return <<"ENDSCRIPT"; |
return <<"ENDSCRIPT"; |
function cloneChoice() { |
function cloneChoice() { |
if (document.requestcourse.cloning) { |
if (document.requestcourse.cloning) { |
var radioLength = document.requestcourse.cloning.length; |
var radioLength = document.requestcourse.cloning.length; |
if (radioLength == undefined) { |
if (radioLength == undefined) { |
var val = document.requestcourse.cloning.value; |
var val = document.requestcourse.cloning.value; |
if ((val == 'textbook') || (val == 'existing')) { |
if ((val == 'textbook') || (val == 'template') || (val == 'existing') || (val == 'colleague')) { |
var elem = document.getElementById('show'+val); |
var elem = document.getElementById('show'+val); |
if (document.requestcourse.cloning.checked) { |
if (document.requestcourse.cloning.checked) { |
elem.style.display = 'block'; |
elem.style.display = 'block'; |
Line 4689 function cloneChoice() {
|
Line 5372 function cloneChoice() {
|
} else { |
} else { |
for (var i=0; i<radioLength; i++) { |
for (var i=0; i<radioLength; i++) { |
var val = document.requestcourse.cloning[i].value; |
var val = document.requestcourse.cloning[i].value; |
if ((val == 'textbook') || (val == 'existing')) { |
if ((val == 'textbook') || (val == 'template') || (val == 'existing') || (val == 'colleague')) { |
var elem = document.getElementById('show'+val); |
var elem = document.getElementById('show'+val); |
if (document.requestcourse.cloning[i].checked) { |
if (document.requestcourse.cloning[i].checked) { |
elem.style.display = 'block'; |
elem.style.display = 'block'; |
Line 4697 function cloneChoice() {
|
Line 5380 function cloneChoice() {
|
if (val == 'textbook') { |
if (val == 'textbook') { |
uncheckRadio('book'); |
uncheckRadio('book'); |
} |
} |
|
if (val == 'template') { |
|
uncheckRadio('template'); |
|
} |
if (val == 'existing') { |
if (val == 'existing') { |
uncheckRadio('owned'); |
uncheckRadio('owned'); |
} |
} |
|
if (val == 'colleague') { |
|
uncheckRadio('colleague'); |
|
} |
elem.style.display = 'none'; |
elem.style.display = 'none'; |
} |
} |
} |
} |
Line 4724 function uncheckRadio(radioGroupName) {
|
Line 5413 function uncheckRadio(radioGroupName) {
|
|
|
function uncheckAllRadio() { |
function uncheckAllRadio() { |
uncheckRadio('cloning'); |
uncheckRadio('cloning'); |
var numbook = $numbook; |
var numbook = $numprefab->{'textbooks'}; |
|
var numtemplate = $numprefab->{'templates'}; |
var numcurrent = $numcurrent; |
var numcurrent = $numcurrent; |
|
var numcolleague = $numcolleague; |
if (numbook > 0) { |
if (numbook > 0) { |
uncheckRadio('textbook'); |
uncheckRadio('textbook'); |
} |
} |
|
if (numtemplate > 0) { |
|
uncheckRadio('template'); |
|
} |
if (numcurrent > 0) { |
if (numcurrent > 0) { |
uncheckRadio('existing'); |
uncheckRadio('existing'); |
} |
} |
|
if (numcolleague > 0) { |
|
uncheckRadio('colleague'); |
|
} |
return; |
return; |
} |
} |
|
|
Line 4741 function validTextbookReq() {
|
Line 5438 function validTextbookReq() {
|
var radioLength = document.requestcourse.cloning.length; |
var radioLength = document.requestcourse.cloning.length; |
if (radioLength == undefined) { |
if (radioLength == undefined) { |
if (document.requestcourse.cloning.checked == false) { |
if (document.requestcourse.cloning.checked == false) { |
alert("$lt{'choose'}"); |
alert("$js_lt{'choose'}"); |
return false; |
return false; |
} else { |
} else { |
cloneChoice = document.requestcourse.cloning.value; |
cloneChoice = document.requestcourse.cloning.value; |
Line 4754 function validTextbookReq() {
|
Line 5451 function validTextbookReq() {
|
} |
} |
} |
} |
if (cloneChoice == 0) { |
if (cloneChoice == 0) { |
alert("$lt{'choose'}"); |
alert("$js_lt{'choose'}"); |
return false; |
return false; |
} |
} |
} |
} |
var group; |
var group; |
if ((cloneChoice == 'textbook') || (cloneChoice == 'existing')) { |
if ((cloneChoice == 'textbook') || (cloneChoice == 'template') || (cloneChoice == 'existing') || (cloneChoice == 'colleague')) { |
var group; |
var group; |
if (cloneChoice == 'textbook') { |
if (cloneChoice == 'textbook') { |
group = document.getElementsByName('book'); |
group = document.getElementsByName('book'); |
} else { |
} else { |
group = document.getElementsByName('owned'); |
if (cloneChoice == 'template') { |
|
group = document.getElementsByName('template'); |
|
} else { |
|
if (cloneChoice == 'existing') { |
|
group = document.getElementsByName('owned'); |
|
} else { |
|
group = document.getElementsByName('colleague'); |
|
} |
|
} |
} |
} |
var groupLength = group.length; |
var groupLength = group.length; |
var chosen = 0; |
var chosen = 0; |
Line 4782 function validTextbookReq() {
|
Line 5487 function validTextbookReq() {
|
} |
} |
if (chosen == 0) { |
if (chosen == 0) { |
if (cloneChoice == 'textbook') { |
if (cloneChoice == 'textbook') { |
alert("$lt{'textbook'}"); |
alert("$js_lt{'textbook'}"); |
} else { |
} else { |
alert("$lt{'existing'}"); |
if (cloneChoice == 'template') { |
|
alert("$js_lt{'template'}"); |
|
} else { |
|
if (cloneChoice == 'existing') { |
|
alert("$js_lt{'existing'}"); |
|
} else { |
|
alert("$js_lt{'colleague'}"); |
|
} |
|
} |
} |
} |
return false; |
return false; |
} |
} |
} |
} |
} |
} |
if (document.requestcourse.cdescr.value == '') { |
if (document.requestcourse.cdescr.value == '') { |
alert("$lt{'title'}"); |
alert("$js_lt{'title'}"); |
return false; |
return false; |
} |
} |
|
$customvalidationjs |
return true; |
return true; |
} |
} |
|
|
Line 4801 ENDSCRIPT
|
Line 5515 ENDSCRIPT
|
|
|
} |
} |
|
|
|
sub textbook_request_disabled { |
|
my ($r,$dom,$action,$can_request) = @_; |
|
if (ref($can_request) eq 'HASH') { |
|
if ($action eq 'process') { |
|
unless ((scalar(keys(%{$can_request})) == 1)) { |
|
&Apache::lonhtmlcommon::add_breadcrumb( |
|
{ href => '/adm/requestcourse', |
|
text => 'Pick action', |
|
}); |
|
} |
|
} |
|
} |
|
$r->print(&header('Course Request')); |
|
&Apache::lonhtmlcommon::add_breadcrumb({text=>'Course Request'}); |
|
$r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests'). |
|
'<div>'. |
|
'<p class="LC_info">'.&mt('You do not have privileges to request creation of textbook courses.').'</p>'); |
|
if (ref($can_request) eq 'HASH') { |
|
if (scalar(keys(%{$can_request})) > 1) { |
|
$r->print('<a href="/adm/requestcourse">'.&mt('Go back').'</a>'); |
|
} |
|
} |
|
$r->print('</div>'. |
|
&Apache::loncommon::end_page()); |
|
return; |
|
} |
|
|
sub startContentScreen { |
sub startContentScreen { |
my ($r,$mode)=@_; |
my ($r,$mode)=@_; |
$r->print("\n".'<ul class="LC_TabContentBigger" id="textbookreq">'."\n"); |
$r->print("\n".'<ul class="LC_TabContentBigger" id="textbookreq">'."\n"); |