version 1.64, 2012/08/14 15:45:06
|
version 1.78, 2014/04/16 14:40:17
|
Line 128 sub handler {
|
Line 128 sub handler {
|
} |
} |
|
|
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
['action','showdom','cnum','state','crstype','queue']); |
['action','showdom','cnum','state','crstype','queue','tabs']); |
&Apache::lonhtmlcommon::clear_breadcrumbs(); |
&Apache::lonhtmlcommon::clear_breadcrumbs(); |
my $dom = &get_course_dom(); |
my $dom = &get_course_dom(); |
my $action = $env{'form.action'}; |
my $action = $env{'form.action'}; |
my $state = $env{'form.state'}; |
my $state = $env{'form.state'}; |
my (%states,%stored); |
my (%states,%stored); |
my ($jscript,$uname,$udom,$result,$warning); |
my ($jscript,$uname,$udom,$result,$warning,$showcredits,$instcredits,%can_request, |
|
%request_domains,@incdoms); |
|
my %domdefs = &Apache::lonnet::get_domain_defaults($dom); |
|
if ($domdefs{'officialcredits'} || $domdefs{'unofficialcredits'} || $domdefs{'textbookcredits'}) { |
|
$showcredits = 1; |
|
} |
|
|
|
my $canreq = |
|
&Apache::lonnet::check_can_request($dom,\%can_request,\%request_domains); |
|
|
|
foreach my $item (keys(%request_domains)) { |
|
if (ref($request_domains{$item}) eq 'ARRAY') { |
|
foreach my $possdom (@{$request_domains{$item}}) { |
|
unless(grep(/^\Q$possdom\E$/,@incdoms)) { |
|
push(@incdoms,$possdom); |
|
} |
|
} |
|
} |
|
} |
|
|
|
if ($canreq) { |
|
if (($env{'form.crstype'} eq 'textbook') || |
|
(scalar(keys(%can_request)) == 1) && ($can_request{'textbook'})) { |
|
my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom); |
|
if ($action eq 'log') { |
|
my $usetabs; |
|
if ((scalar(keys(%can_request)) == 1) && ($can_request{'textbook'})) { |
|
$usetabs = 1; |
|
} elsif ($env{'form.tabs'} eq 'on') { |
|
$usetabs = 1; |
|
} |
|
&Apache::lonhtmlcommon::add_breadcrumb({text=>'Course Request'}); |
|
my $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests'); |
|
&print_request_logs($r,$dom,undef,undef,$crumb,$usetabs); |
|
} elsif ($action eq 'process') { |
|
if ($can_request{'textbook'}) { |
|
&process_textbook_request($r,$dom,$action,\%domdefs,\%domconfig,\%can_request); |
|
} else { |
|
&textbook_request_disabled($r,$dom,\%can_request); |
|
} |
|
} else { |
|
if ($can_request{'textbook'}) { |
|
&print_textbook_form($r,$dom,\@incdoms,\%domdefs,$domconfig{'requestcourses'},\%can_request); |
|
} else { |
|
&textbook_request_disabled($r,$dom,\%can_request); |
|
} |
|
} |
|
return OK; |
|
} |
|
} |
|
|
$states{'display'} = ['details']; |
$states{'display'} = ['details']; |
$states{'view'} = ['pick_request','details','cancel','removal']; |
$states{'view'} = ['pick_request','details','cancel','removal']; |
Line 147 sub handler {
|
Line 196 sub handler {
|
} |
} |
} |
} |
|
|
|
if (($action eq 'new') && (&Apache::loncoursequeueadmin::author_prompt())) { |
|
if (ref($states{$action}) eq 'ARRAY') { |
|
push(@{$states{$action}},'reqauthor'); |
|
} |
|
} |
|
|
foreach my $key (keys(%states)) { |
foreach my $key (keys(%states)) { |
if (ref($states{$key}) eq 'ARRAY') { |
if (ref($states{$key}) eq 'ARRAY') { |
unshift (@{$states{$key}},'crstype'); |
unshift (@{$states{$key}},'crstype'); |
Line 155 sub handler {
|
Line 210 sub handler {
|
|
|
my @invalidcrosslist; |
my @invalidcrosslist; |
my %trail = ( |
my %trail = ( |
crstype => 'Request Action', |
crstype => 'Pick Action', |
codepick => 'Category', |
codepick => 'Category', |
courseinfo => 'Description', |
courseinfo => 'Description', |
enrollment => 'Access Dates', |
enrollment => 'Access Dates', |
personnel => 'Personnel', |
personnel => 'Personnel', |
review => 'Review', |
review => 'Review', |
process => 'Result', |
process => 'Result', |
|
reqauthor => 'Authoring Space Result', |
pick_request => 'Display Summary', |
pick_request => 'Display Summary', |
details => 'Request Details', |
details => 'Request Details', |
cancel => 'Cancel Request', |
cancel => 'Cancel Request', |
Line 173 sub handler {
|
Line 229 sub handler {
|
$trail{'enrollment'} = 'Enrollment'; |
$trail{'enrollment'} = 'Enrollment'; |
} |
} |
|
|
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))) { |
if (($dom eq $env{'request.role.domain'}) && (&Apache::lonnet::allowed('ccc',$dom))) { |
Line 262 sub handler {
|
Line 318 sub handler {
|
} |
} |
} |
} |
} |
} |
my %elements = &form_elements($dom); |
(my $elements,$instcredits) = &form_elements($dom,$showcredits); |
my $elementsref = {}; |
my $elementsref = {}; |
if (ref($elements{$action}) eq 'HASH') { |
if ((ref($elements) eq 'HASH') && (ref($elements->{$action}) eq 'HASH')) { |
if (ref($elements{$action}{$state}) eq 'HASH') { |
if (ref($elements->{$action}{$state}) eq 'HASH') { |
$elementsref = $elements{$action}{$state}; |
$elementsref = $elements->{$action}{$state}; |
} |
} |
} |
} |
if (($state eq 'courseinfo') && ($env{'form.clonedom'} eq '')) { |
if (($state eq 'courseinfo') && ($env{'form.clonedom'} eq '')) { |
Line 288 sub handler {
|
Line 344 sub handler {
|
|
|
my $loaditems = &onload_action($action,$state); |
my $loaditems = &onload_action($action,$state); |
|
|
my (%can_request,%request_domains); |
|
my $canreq = |
|
&Apache::lonnet::check_can_request($dom,\%can_request,\%request_domains); |
|
if ($action eq 'new') { |
if ($action eq 'new') { |
if ($canreq) { |
if ($canreq) { |
if ($state eq 'crstype') { |
if ($state eq 'crstype') { |
&print_main_menu($r,\%can_request,\%states,$dom,$jscript,$loaditems, |
&print_main_menu($r,\%can_request,\%states,$dom,$jscript,$loaditems, |
$crumb,\%request_domains); |
$crumb,\@incdoms); |
} else { |
} else { |
&request_administration($r,$action,$state,$page,\%states,$dom, |
&request_administration($r,$action,$state,$page,\%states,$dom, |
$jscript,$loaditems,$crumb,$newinstcode, |
$jscript,$loaditems,$crumb,$newinstcode, |
$codechk,$checkedcode,$description, |
$codechk,$checkedcode,$description, |
\@invalidcrosslist); |
$showcredits,$instcredits,\@invalidcrosslist); |
} |
} |
} else { |
} else { |
$r->print(&header('Course/Community Requests').$crumb. |
$r->print(&header('Course/Community Requests').$crumb. |
Line 310 sub handler {
|
Line 363 sub handler {
|
} |
} |
} elsif ($action eq 'view') { |
} elsif ($action eq 'view') { |
if ($state eq 'crstype') { |
if ($state eq 'crstype') { |
&print_main_menu($r,\%can_request,\%states,$dom,$jscript,$loaditems,$crumb,\%request_domains); |
&print_main_menu($r,\%can_request,\%states,$dom,$jscript,$loaditems,$crumb,\@incdoms); |
} else { |
} else { |
&request_administration($r,$action,$state,$page,\%states,$dom,$jscript, |
&request_administration($r,$action,$state,$page,\%states,$dom,$jscript, |
$loaditems,$crumb); |
$loaditems,$crumb,'','','','',$showcredits); |
} |
} |
} elsif ($action eq 'display') { |
} elsif ($action eq 'display') { |
if ($warning ne '') { |
if ($warning ne '') { |
Line 324 sub handler {
|
Line 377 sub handler {
|
&close_popup_form()); |
&close_popup_form()); |
} else { |
} else { |
&request_administration($r,$action,$state,$page,\%states,$dom,$jscript, |
&request_administration($r,$action,$state,$page,\%states,$dom,$jscript, |
$loaditems,$crumb,'','','','','',$uname,$udom); |
$loaditems,$crumb,'','','','',$showcredits,'','', |
|
$uname,$udom); |
} |
} |
} elsif ($action eq 'log') { |
} elsif ($action eq 'log') { |
if ($state eq 'crstype') { |
if ($state eq 'crstype') { |
&print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb,\%request_domains); |
&print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb,\@incdoms); |
} else { |
} else { |
$jscript .= <<ENDJS; |
$jscript .= <<ENDJS; |
|
|
Line 343 function setPage(formname) {
|
Line 397 function setPage(formname) {
|
} |
} |
|
|
ENDJS |
ENDJS |
&print_request_logs($r,$dom,$jscript,$loaditems,$crumb); |
&print_request_logs($r,$dom,$jscript,$loaditems,$crumb,\%can_request); |
} |
} |
} else { |
} else { |
&print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb,\%request_domains); |
&print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb,\@incdoms); |
} |
} |
return OK; |
return OK; |
} |
} |
Line 439 sub get_breadcrumbs {
|
Line 493 sub get_breadcrumbs {
|
$crumb = &Apache::lonhtmlcommon::breadcrumbs('Course/Community Requests','Course_Requests'); |
$crumb = &Apache::lonhtmlcommon::breadcrumbs('Course/Community Requests','Course_Requests'); |
last; |
last; |
} else { |
} else { |
if (($$state eq 'process') || ($$state eq 'removal')) { |
if (($$state eq 'process') || ($$state eq 'removal') || ($$state eq 'reqauthor')) { |
&Apache::lonhtmlcommon::add_breadcrumb( |
&Apache::lonhtmlcommon::add_breadcrumb( |
{ href => '/adm/requestcourse', |
{ href => '/adm/requestcourse', |
text => "$trail->{$states->{$action}[$i]}", |
text => "$trail->{$states->{$action}[$i]}", |
Line 488 sub header {
|
Line 542 sub header {
|
} |
} |
|
|
sub form_elements { |
sub form_elements { |
my ($dom) = @_; |
my ($dom,$showcredits) = @_; |
|
my $instcredits; |
my %elements = |
my %elements = |
( |
( |
new => { |
new => { |
Line 596 sub form_elements {
|
Line 651 sub form_elements {
|
$extras{'loncapasec_'.$i} = 'text', |
$extras{'loncapasec_'.$i} = 'text', |
} |
} |
} |
} |
|
(my $outcome,my $desc,$instcredits) = |
|
&Apache::lonnet::auto_validate_instcode(undef,$dom,$instcode); |
|
if ($showcredits && $instcredits eq '') { |
|
$extras{'coursecredits'} = 'text'; |
|
} |
|
} elsif (($env{'form.crstype'} eq 'unofficial') || ($env{'form.crstype'} eq 'textbook')) { |
|
if ($showcredits) { |
|
$extras{'coursecredits'} = 'text'; |
|
} |
} |
} |
my $crosslisttotal = $env{'form.crosslisttotal'}; |
my $crosslisttotal = $env{'form.crosslisttotal'}; |
if ($env{'form.addcrosslist'}) { |
if ($env{'form.addcrosslist'}) { |
Line 641 sub form_elements {
|
Line 705 sub form_elements {
|
} |
} |
my %personnelhash = (%{$elements{'new'}{'personnel'}},%people); |
my %personnelhash = (%{$elements{'new'}{'personnel'}},%people); |
%{$elements{'new'}{'personnel'}} = %personnelhash; |
%{$elements{'new'}{'personnel'}} = %personnelhash; |
return %elements; |
return (\%elements,$instcredits);; |
} |
} |
|
|
sub onload_action { |
sub onload_action { |
Line 661 sub onload_action {
|
Line 725 sub onload_action {
|
} |
} |
|
|
sub print_main_menu { |
sub print_main_menu { |
my ($r,$can_request,$states,$dom,$jscript,$loaditems,$crumb,$request_domains) = @_; |
my ($r,$can_request,$states,$dom,$jscript,$loaditems,$crumb,$incdoms) = @_; |
my ($types,$typename) = &Apache::loncommon::course_types(); |
my ($types,$typename) = &Apache::loncommon::course_types(); |
my $onchange = 'this.form.submit()'; |
my $onchange = 'this.form.submit()'; |
my $nextstate_setter = "\n"; |
my $nextstate_setter = "\n"; |
Line 699 $nextstate_setter
|
Line 763 $nextstate_setter
|
function check_can_request(crschoice,actionchoice) { |
function check_can_request(crschoice,actionchoice) { |
var official = ''; |
var official = ''; |
var unofficial = ''; |
var unofficial = ''; |
var community = ''; |
var community = ''; |
|
var textbook = ''; |
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 711 END
|
Line 776 END
|
my %lt = &Apache::lonlocal::texthash( |
my %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 this domain.', |
community => 'You are not permitted to request creation of a community in this domain.', |
all => 'You must choose a specific course type when making a new course request.\\n\"All types\" is not allowed.', |
textbook => 'You are not permitted to request creation of a textbook course in this domain', |
|
all => 'You must choose a specific course type when making a new course request.', |
|
allt => '"All types" is not allowed.', |
); |
); |
$js .= <<END; |
$js .= <<END; |
if (crschoice == 'official') { |
if (crschoice == 'official') { |
Line 733 END
|
Line 800 END
|
return false; |
return false; |
} |
} |
} else { |
} else { |
if (actionchoice == 'new') { |
if (crschoice == 'textbook') { |
alert("$lt{'all'}"); |
if (textbook != 1) { |
return false; |
alert("$lt{'community'}"); |
} |
return false; |
|
} |
|
} else { |
|
if (actionchoice == 'new') { |
|
alert('$lt{'all'}'+'\\n'+'$lt{'allt'}'); |
|
return false; |
|
} |
|
} |
} |
} |
} |
} |
} |
} |
return true; |
return true; |
} |
} |
END |
END |
my ($pagetitle,$pageinfo,$domaintitle); |
my ($pagetitle,$pageinfo,$domaintitle,$earlyout); |
if (ref($can_request) eq 'HASH') { |
if (ref($can_request) eq 'HASH') { |
if (($can_request->{'official'}) || ($can_request->{'unofficial'})) { |
if (($can_request->{'official'}) || ($can_request->{'unofficial'}) || $can_request->{'textbook'}) { |
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 759 END
|
Line 833 END
|
$pagetitle = 'Community Requests'; |
$pagetitle = 'Community Requests'; |
$pageinfo = &mt('Request creation of a new course, or review your pending requests.'); |
$pageinfo = &mt('Request creation of a new course, or review your pending requests.'); |
$domaintitle = &mt('Community Domain'); |
$domaintitle = &mt('Community Domain'); |
} else { |
} elsif ((ref($incdoms) eq 'ARRAY') && ((@{$incdoms} > 1) || |
|
((@{$incdoms} == 1) && ($incdoms->[0] ne $dom)))) { |
$pagetitle = 'Course/Community Requests'; |
$pagetitle = 'Course/Community Requests'; |
$pageinfo = &mt('You do not have rights to request creation of courses in this domain; please choose a different domain.'); |
$pageinfo = &mt('You do not have rights to request creation of courses in this domain; please choose a different domain.'); |
$domaintitle = &mt('Course/Community Domain'); |
$domaintitle = &mt('Course/Community Domain'); |
} |
} else { |
} |
$pagetitle = 'Course/Community Requests'; |
my @incdoms; |
$pageinfo = &mt('You do not have rights to request creation of courses or communities.'); |
if (ref($request_domains) eq 'HASH') { |
$earlyout = 1; |
foreach my $item (keys(%{$request_domains})) { |
|
if (ref($request_domains->{$item}) eq 'ARRAY') { |
|
foreach my $possdom (@{$request_domains->{$item}}) { |
|
unless(grep(/^\Q$possdom\E$/,@incdoms)) { |
|
push(@incdoms,$possdom); |
|
} |
|
} |
|
} |
|
} |
} |
} |
} |
$r->print(&header($pagetitle,$js.$jscript,$loaditems).$crumb. |
$r->print(&header($pagetitle,$js.$jscript,$loaditems).$crumb. |
'<p>'.$pageinfo.'</p>'. |
'<p>'.$pageinfo.'</p>'); |
'<div>'. |
if ($earlyout) { |
|
$r->print(&Apache::loncommon::end_page()); |
|
return; |
|
} |
|
$r->print('<div>'. |
&Apache::lonhtmlcommon::start_pick_box(). |
&Apache::lonhtmlcommon::start_pick_box(). |
&Apache::lonhtmlcommon::row_title($domaintitle). |
&Apache::lonhtmlcommon::row_title($domaintitle). |
'<form name="domforcourse" method="post" action="/adm/requestcourse">'. |
'<form name="domforcourse" method="post" action="/adm/requestcourse">'. |
&Apache::loncommon::select_dom_form($dom,'showdom','',1,$onchange,\@incdoms)); |
&Apache::loncommon::select_dom_form($dom,'showdom','',1,$onchange,$incdoms)); |
if (!$onchange) { |
if (!$onchange) { |
$r->print(' <input type="submit" name="godom" value="'. |
$r->print(' <input type="submit" name="godom" value="'. |
&mt('Change').'" />'); |
&mt('Change').'" />'); |
} |
} |
unless ((ref($can_request) eq 'HASH') && (keys(%{$can_request}) > 0)) { |
unless ((ref($can_request) eq 'HASH') && (keys(%{$can_request}) > 0)) { |
$r->print(&Apache::lonhtmlcommon::row_closure(1)."\n". |
$r->print('</form>'.&Apache::lonhtmlcommon::row_closure(1)."\n". |
&Apache::lonhtmlcommon::end_pick_box().'</div>'."\n". |
&Apache::lonhtmlcommon::end_pick_box().'</div>'."\n". |
&Apache::loncommon::end_page()); |
&Apache::loncommon::end_page()); |
return; |
return; |
Line 847 END
|
Line 918 END
|
|
|
sub request_administration { |
sub request_administration { |
my ($r,$action,$state,$page,$states,$dom,$jscript,$loaditems,$crumb, |
my ($r,$action,$state,$page,$states,$dom,$jscript,$loaditems,$crumb, |
$newinstcode,$codechk,$checkedcode,$description,$invalidcrosslist, |
$newinstcode,$codechk,$checkedcode,$description,$showcredits, |
$uname,$udom) = @_; |
$instcredits,$invalidcrosslist,$uname,$udom) = @_; |
my $js; |
my $js; |
if (($action eq 'new') || (($action eq 'view') && ($state eq 'pick_request'))) { |
if (($action eq 'new') || (($action eq 'view') && ($state eq 'pick_request'))) { |
$js = <<END; |
$js = <<END; |
Line 890 END
|
Line 961 END
|
} |
} |
$r->print(&header($title,$js.$jscript,$loaditems,$jsextra).$crumb); |
$r->print(&header($title,$js.$jscript,$loaditems,$jsextra).$crumb); |
&print_request_form($r,$action,$state,$page,$states,$dom,$newinstcode, |
&print_request_form($r,$action,$state,$page,$states,$dom,$newinstcode, |
$codechk,$checkedcode,$description,$invalidcrosslist); |
$codechk,$checkedcode,$description,$showcredits, |
|
$instcredits,$invalidcrosslist); |
} elsif ($action eq 'view') { |
} elsif ($action eq 'view') { |
my $jsextra; |
my $jsextra; |
my $formname = 'requestcrs'; |
my $formname = 'requestcrs'; |
Line 921 END
|
Line 993 END
|
$title = &mt('Pending requests for official courses'); |
$title = &mt('Pending requests for official courses'); |
} elsif ($env{'form.crstype'} eq 'unofficial') { |
} elsif ($env{'form.crstype'} eq 'unofficial') { |
$title = &mt('Pending requests for unofficial courses'); |
$title = &mt('Pending requests for unofficial courses'); |
|
} elsif ($env{'form.crstype'} eq 'textbook') { |
|
$title = &mt('Pending requests for textbook courses'); |
} else { |
} else { |
$title = &mt('Pending course/community requests'); |
$title = &mt('Pending course/community requests'); |
} |
} |
Line 944 END
|
Line 1018 END
|
} |
} |
$r->print('<h3>'.$title.'</h3><div>'."\n".$form."\n". |
$r->print('<h3>'.$title.'</h3><div>'."\n".$form."\n". |
&print_review($dom,\@codetitles,\%cat_titles,\%cat_order, |
&print_review($dom,\@codetitles,\%cat_titles,\%cat_order, |
\@code_order)."\n". |
\@code_order,'','','','',$instcredits)."\n". |
'<input name="origcnum" value="'.$origcnum.'" type="hidden" />'."\n"); |
'<input name="origcnum" value="'.$origcnum.'" type="hidden" />'."\n"); |
my @excluded = &get_excluded_elements($dom,$states,'new','review'); |
my @excluded = &get_excluded_elements($dom,$states,'new','review', |
|
$showcredits); |
push(@excluded,'origcnum'); |
push(@excluded,'origcnum'); |
$r->print(&Apache::lonhtmlcommon::echo_form_input(\@excluded).'</div>'); |
$r->print(&Apache::lonhtmlcommon::echo_form_input(\@excluded).'</div>'); |
my $other = 'modify'; |
my $other = 'modify'; |
Line 968 END
|
Line 1043 END
|
my ($result,$output) = &print_cancel_request($dom,$env{'form.origcnum'}); |
my ($result,$output) = &print_cancel_request($dom,$env{'form.origcnum'}); |
$r->print('<h3>'.$title.'</h3><div>'."\n".$form."\n". |
$r->print('<h3>'.$title.'</h3><div>'."\n".$form."\n". |
$output); |
$output); |
my @excluded = &get_excluded_elements($dom,$states,'view','cancel'); |
my @excluded = &get_excluded_elements($dom,$states,'view','cancel', |
|
$showcredits); |
$r->print(&Apache::lonhtmlcommon::echo_form_input(\@excluded).'</div>'); |
$r->print(&Apache::lonhtmlcommon::echo_form_input(\@excluded).'</div>'); |
my %navtxt = &Apache::lonlocal::texthash ( |
my %navtxt = &Apache::lonlocal::texthash ( |
prev => 'Back', |
prev => 'Back', |
Line 1045 END
|
Line 1121 END
|
$r->print(&header($title,'','','',{ 'only_body' => 1}). |
$r->print(&header($title,'','','',{ 'only_body' => 1}). |
$crumb."\n".'<h3>'.$header.'</h3>'. |
$crumb."\n".'<h3>'.$header.'</h3>'. |
&print_review($dom,\@codetitles,\%cat_titles,\%cat_order, |
&print_review($dom,\@codetitles,\%cat_titles,\%cat_order, |
\@code_order,$uname,$udom)."\n".'</div>'. |
\@code_order,$uname,$udom,'','',$instcredits)."\n". |
|
'</div>'. |
&close_popup_form()); |
&close_popup_form()); |
} |
} |
$r->print(&Apache::loncommon::end_page()); |
$r->print(&Apache::loncommon::end_page()); |
Line 1239 sub get_instcode {
|
Line 1316 sub get_instcode {
|
|
|
sub print_request_form { |
sub print_request_form { |
my ($r,$action,$state,$page,$states,$dom,$newinstcode,$codechk,$checkedcode, |
my ($r,$action,$state,$page,$states,$dom,$newinstcode,$codechk,$checkedcode, |
$description,$invalidcrosslist) = @_; |
$description,$showcredits,$instcredits,$invalidcrosslist) = @_; |
my $formname = 'requestcrs'; |
my $formname = 'requestcrs'; |
my ($next,$prev,$message,$output,$codepicker,$crstype); |
my ($next,$prev,$message,$output,$codepicker,$crstype); |
$prev = $states->{$action}[$page-1]; |
$prev = $states->{$action}[$page-1]; |
Line 1312 sub print_request_form {
|
Line 1389 sub print_request_form {
|
} |
} |
$r->print(&print_enrollment_menu($formname,$instcode,$dom,\@codetitles, |
$r->print(&print_enrollment_menu($formname,$instcode,$dom,\@codetitles, |
\%cat_titles,\%cat_order,\@code_order, |
\%cat_titles,\%cat_order,\@code_order, |
$invalidcrosslist)); |
$showcredits,$instcredits,$invalidcrosslist)); |
} elsif ($state eq 'personnel') { |
} elsif ($state eq 'personnel') { |
$r->print(&print_personnel_menu($dom,$formname,$crstype,$invalidcrosslist)); |
$r->print(&print_personnel_menu($dom,$formname,$crstype,$invalidcrosslist)); |
} elsif ($state eq 'review') { |
} elsif ($state eq 'review') { |
Line 1428 sub print_request_form {
|
Line 1505 sub print_request_form {
|
} else { |
} else { |
$r->print('<h3>'.&mt('Review course request details before submission').'</h3>'); |
$r->print('<h3>'.&mt('Review course request details before submission').'</h3>'); |
} |
} |
$r->print(&print_review($dom,\@codetitles,\%cat_titles,\%cat_order,\@code_order,'','',\@disallowed,\%disallowmsg). |
$r->print(&print_review($dom,\@codetitles,\%cat_titles,\%cat_order,\@code_order,'','',\@disallowed,\%disallowmsg,$instcredits). |
'<input type="hidden" name="cnum" value="'.$cnum.'" />'); |
'<input type="hidden" name="cnum" value="'.$cnum.'" />'); |
|
my $fullname = &Apache::loncommon::plainname($env{'user.name'}, |
|
$env{'user.domain'}); |
|
my $postprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'review',$env{'user.name'}, |
|
$env{'user.domain'},$fullname,$env{'form.cdescr'}); |
|
if (ref($postprocess) eq 'HASH') { |
|
if ($postprocess->{'reviewweb'}) { |
|
$r->print($postprocess->{'reviewweb'}); |
|
} |
|
} |
if ($crstype eq 'community') { |
if ($crstype eq 'community') { |
$navtxt{'next'} = &mt('Submit community request'); |
$navtxt{'next'} = &mt('Submit community request'); |
} else { |
} else { |
Line 1440 sub print_request_form {
|
Line 1526 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); |
my ($storeresult,$result) = &print_request_outcome($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')) { |
$r->print('<p>'); |
|
if ($storeresult eq 'ok') { |
if ($storeresult eq 'ok') { |
$r->print('<a href="/adm/requestcourse?action=view&state=details&showdom='.$dom.'&cnum='. $env{'form.cnum'}.'">'. |
$r->print('<p><a href="/adm/requestcourse?action=view&state=details&showdom='.$dom.'&cnum='. $env{'form.cnum'}.'">'. |
&mt('Modify this request').'</a>'.(' 'x4)); |
&mt('Modify this request').'</a>'.(' 'x4). |
|
'<a href="/adm/requestcourse">'.&mt('Make another request').'</a></p>'); |
|
} |
|
if (&Apache::loncoursequeueadmin::author_prompt()) { |
|
&print_author_prompt($r,$env{'form.action'},$env{'form.cnum'},$env{'form.showdom'}, |
|
$env{'form.crstype'},$storeresult); |
|
} elsif ($storeresult eq 'created') { |
|
$r->print('<p><a href="/adm/requestcourse">'.&mt('Make another request').'</a></p>'); |
|
} |
|
} |
|
} elsif ($state eq 'reqauthor') { |
|
my ($result,@links); |
|
if ($env{'form.requestauthor'}) { |
|
$r->print(&Apache::loncoursequeueadmin::process_reqauthor(\$result)); |
|
if ($result eq 'created') { |
|
my $role = 'au'; |
|
my $spec = "$role./$env{'form.showdom'}/"; |
|
push(@links,&mt('Enter your Authoring Space with role: [_1]', |
|
'<a href="/adm/roles?selectrole=1&'.$spec.'=1">'. |
|
&Apache::lonnet::plaintext($role).'</a>')); |
|
} |
|
} |
|
if (($env{'form.disposition'} eq 'created') && |
|
($env{'form.cnum'} =~ /^$match_courseid$/) && |
|
($env{'form.showdom'} =~ /^$match_domain$/)) { |
|
my ($spec,$area,$role,$type); |
|
my $role = 'cc'; |
|
my $spec = "$role./$env{'form.showdom'}/$env{'form.cnum'}"; |
|
my $type = 'Course'; |
|
if ($env{'form.crstype'} eq 'community') { |
|
$type = 'Community'; |
} |
} |
$r->print('<a href="/adm/requestcourse">'.&mt('Make another request').'</a></p>'); |
my $showrole = &Apache::lonnet::plaintext($role,$type); |
return; |
unshift(@links,&mt('Enter new course with role: [_1]', |
|
'<a href="/adm/roles?selectrole=1&'.$spec.'=1">'.$showrole.'</a>')); |
|
} |
|
if (@links > 1) { |
|
$r->print(&mt('New roles will be listed on your [_1]Roles[_2] page.', |
|
'<a href="/adm/roles">','</a>').' '.&mt('Choose a role:'). |
|
'<ul>'); |
|
foreach my $link (@links) { |
|
$r->print('<li>'.$link.'</li>'); |
|
} |
|
$r->print('</ul>'); |
|
} elsif (@links == 1) { |
|
$r->print('<p>'.$links[0].'</p>'); |
} |
} |
} |
} |
my @excluded = &get_excluded_elements($dom,$states,$action,$state); |
my @excluded = &get_excluded_elements($dom,$states,$action,$state,$showcredits); |
if ($state eq 'personnel') { |
if ($state eq 'personnel') { |
push(@excluded,'persontotal'); |
push(@excluded,'persontotal'); |
} |
} |
Line 1480 sub print_request_form {
|
Line 1608 sub print_request_form {
|
$count ++; |
$count ++; |
} |
} |
$env{'form.persontotal'} = $count; |
$env{'form.persontotal'} = $count; |
|
|
} |
} |
} |
} |
if ($state eq 'enrollment') { |
if ($state eq 'enrollment') { |
push(@excluded,('sectotal','crosslisttotal')); |
push(@excluded,('sectotal','crosslisttotal')); |
} |
} |
$r->print(&Apache::lonhtmlcommon::echo_form_input(\@excluded).'</form>'); |
if (($state eq 'process') || ($state eq 'reqauthor')) { |
&display_navbuttons($r,$dom,$formname,$prev,$navtxt{'prev'},$next, |
$r->print('</form>'); |
$navtxt{'next'},$state); |
} else { |
|
$r->print(&Apache::lonhtmlcommon::echo_form_input(\@excluded).'</form>'); |
|
&display_navbuttons($r,$dom,$formname,$prev,$navtxt{'prev'},$next, |
|
$navtxt{'next'},$state); |
|
} |
return; |
return; |
} |
} |
|
|
|
sub print_author_prompt { |
|
my ($r,$action,$cnum,$showdom,$crstype,$storeresult) = @_; |
|
$r->print('<h3>'.&mt('Access to Authoring Space').'</h3>'. |
|
'<p>'. |
|
&mt('Although assessment items can be created directly inside a course, such items only use part of the assessment capabilities of LON-CAPA.'). |
|
'<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>'. |
|
'<p>'.&mt('Request Authoring Space access now?'). |
|
'<span class="LC_nobreak"> '. |
|
'<label><input type="radio" name="requestauthor" value="1" />'.&mt('Yes').'</label>'. |
|
(' 'x2). |
|
'<label><input type="radio" name="requestauthor" value="0" checked="checked"/>'.&mt('No').'</label>'. |
|
'</span></p>'. |
|
'<input type="submit" name="newauthor" value="'.&mt('Submit authoring request').'" />'. |
|
'<input type="hidden" name="state" value="reqauthor" />'. |
|
'<input type="hidden" name="action" value="'.$action.'" />'. |
|
'<input type="hidden" name="cnum" value="'.$cnum.'" />'. |
|
'<input type="hidden" name="showdom" value="'.$showdom.'" />'. |
|
'<input type="hidden" name="crstype" value="'.$crstype.'" />'. |
|
'<input type="hidden" name="disposition" value="'.$storeresult.'" />'. |
|
'<br />'); |
|
} |
|
|
sub get_usertype { |
sub get_usertype { |
my ($persondom,$personname,$curr_rules,$got_rules) = @_; |
my ($persondom,$personname,$curr_rules,$got_rules) = @_; |
my ($rules,$ruleorder) = |
my ($rules,$ruleorder) = |
Line 1547 sub check_newuser_rules {
|
Line 1701 sub check_newuser_rules {
|
} |
} |
|
|
sub get_excluded_elements { |
sub get_excluded_elements { |
my ($dom,$states,$action,$state) = @_; |
my ($dom,$states,$action,$state,$showcredits) = @_; |
my @excluded = ('counter'); |
my @excluded = ('counter'); |
my %elements = &form_elements($dom); |
my ($elements,$instcredits) = &form_elements($dom,$showcredits); |
if (ref($states) eq 'HASH') { |
if (ref($states) eq 'HASH') { |
if (ref($states->{$action}) eq 'ARRAY') { |
if (ref($states->{$action}) eq 'ARRAY') { |
my @items = @{$states->{$action}}; |
my @items = @{$states->{$action}}; |
my $numitems = scalar(@items); |
my $numitems = scalar(@items); |
if ($numitems) { |
if ($numitems) { |
for (my $i=$numitems-1; $i>=0; $i--) { |
for (my $i=$numitems-1; $i>=0; $i--) { |
if (ref($elements{$action}) eq 'HASH') { |
if ((ref($elements) eq 'HASH') && |
if (ref($elements{$action}{$items[$i]}) eq 'HASH') { |
(ref($elements->{$action}) eq 'HASH')) { |
foreach my $key (keys(%{$elements{$action}{$items[$i]}})) { |
if (ref($elements->{$action}{$items[$i]}) eq 'HASH') { |
|
foreach my $key (keys(%{$elements->{$action}{$items[$i]}})) { |
push(@excluded,$key); |
push(@excluded,$key); |
} |
} |
} |
} |
Line 1576 sub get_excluded_elements {
|
Line 1731 sub get_excluded_elements {
|
|
|
sub print_enrollment_menu { |
sub print_enrollment_menu { |
my ($formname,$instcode,$dom,$codetitles,$cat_titles,$cat_order,$code_order, |
my ($formname,$instcode,$dom,$codetitles,$cat_titles,$cat_order,$code_order, |
$invalidcrosslist) =@_; |
$showcredits,$instcredits,$invalidcrosslist) =@_; |
my ($sections,$autoenroll,$access_dates,$output,$hasauto); |
my ($sections,$autoenroll,$access_dates,$output,$hasauto,$hascredits, |
|
$creditsrow,$domdefcredits); |
my $starttime = time; |
my $starttime = time; |
my $endtime = time+(6*30*24*60*60); # 6 months from now, approx |
my $endtime = time+(6*30*24*60*60); # 6 months from now, approx |
|
|
Line 1589 sub print_enrollment_menu {
|
Line 1745 sub print_enrollment_menu {
|
'start' => 'Start auto-enrollment', |
'start' => 'Start auto-enrollment', |
'end' => 'End auto-enrollment', |
'end' => 'End auto-enrollment', |
); |
); |
|
if ($showcredits) { |
|
unless ($env{'form.crstype'} eq 'community') { |
|
my %domdefs = &Apache::lonnet::get_domain_defaults($dom); |
|
$domdefcredits = $domdefs{$env{'form.crstype'}.'credits'}; |
|
} |
|
} |
if ($env{'form.crstype'} eq 'official') { |
if ($env{'form.crstype'} eq 'official') { |
if (&Apache::lonnet::auto_run('',$dom)) { |
if (&Apache::lonnet::auto_run('',$dom)) { |
$output = &show_invalid_crosslists($invalidcrosslist); |
$output = &show_invalid_crosslists($invalidcrosslist); |
Line 1663 sub print_enrollment_menu {
|
Line 1825 sub print_enrollment_menu {
|
&mt('No').'</label></span>'. |
&mt('No').'</label></span>'. |
&Apache::lonhtmlcommon::row_closure(1). |
&Apache::lonhtmlcommon::row_closure(1). |
&date_setting_table($starttime,$endtime,$formname,'enroll', |
&date_setting_table($starttime,$endtime,$formname,'enroll', |
$hasauto,%enrolltitles); |
$hasauto,undef,%enrolltitles); |
|
if ($showcredits) { |
|
if ($instcredits) { |
|
$creditsrow = &mt('[quant,_1,credit]',$instcredits); |
|
} else { |
|
$creditsrow = '<span class="LC_nobreak">'. |
|
'<input type="text" size="3" name="coursecredits"'. |
|
' value="'.$domdefcredits.'" />'; |
|
} |
|
$hascredits = 1; |
|
} |
|
} |
|
} elsif (($env{'form.crstype'} eq 'unofficial') || ($env{'form.crstype'} eq 'textbook')) { |
|
if ($showcredits) { |
|
$creditsrow = '<span class="LC_nobreak">'. |
|
'<input type="text" size="3" name="coursecredits"'. |
|
' value="'.$domdefcredits.'"/>'; |
|
$hascredits = 1; |
} |
} |
} |
} |
my $access_dates = |
my $access_dates = |
&date_setting_table($starttime,$endtime,$formname,'access',$hasauto, |
&date_setting_table($starttime,$endtime,$formname,'access',$hasauto, |
%accesstitles); |
$hascredits,%accesstitles); |
$output .= &Apache::lonhtmlcommon::start_pick_box(); |
$output .= &Apache::lonhtmlcommon::start_pick_box(); |
if ($sections) { |
if ($sections) { |
$output .= $sections; |
$output .= $sections; |
Line 1687 sub print_enrollment_menu {
|
Line 1866 sub print_enrollment_menu {
|
$output .= &Apache::lonhtmlcommon::row_headline('Access'). |
$output .= &Apache::lonhtmlcommon::row_headline('Access'). |
'<h3>'.$header.'</h3>'. |
'<h3>'.$header.'</h3>'. |
&Apache::lonhtmlcommon::row_closure(1). |
&Apache::lonhtmlcommon::row_closure(1). |
$access_dates |
$access_dates; |
|
} |
|
if ($creditsrow) { |
|
$output .= &Apache::lonhtmlcommon::row_headline('Credits'). |
|
'<h3>'.&mt('Credits earned by students').'</h3>'. |
|
&Apache::lonhtmlcommon::row_closure(1). |
|
&Apache::lonhtmlcommon::row_title(&mt('Default credits')). |
|
$creditsrow. |
|
&Apache::lonhtmlcommon::row_closure(1); |
} |
} |
return '<div>'.&Apache::lonhtmlcommon::start_pick_box().$output. |
return '<div>'.&Apache::lonhtmlcommon::start_pick_box().$output. |
&Apache::lonhtmlcommon::end_pick_box().'</div>'; |
&Apache::lonhtmlcommon::end_pick_box().'</div>'; |
Line 1752 sub inst_section_selector {
|
Line 1939 sub inst_section_selector {
|
} |
} |
|
|
sub date_setting_table { |
sub date_setting_table { |
my ($starttime,$endtime,$formname,$prefix,$hasauto,%datetitles) = @_; |
my ($starttime,$endtime,$formname,$prefix,$hasauto,$hascredits,%datetitles)=@_; |
my ($perpetual,$table); |
my ($perpetual,$table); |
my $startform = &Apache::lonhtmlcommon::date_setter($formname,$prefix.'start', |
my $startform = &Apache::lonhtmlcommon::date_setter($formname,$prefix.'start', |
$starttime,'','','',1,'','','',1); |
$starttime,'','','',1,'','','',1); |
Line 1763 sub date_setting_table {
|
Line 1950 sub date_setting_table {
|
$perpetual = ' <span class="LC_nobreak"><label>'. |
$perpetual = ' <span class="LC_nobreak"><label>'. |
'<input type="checkbox" name="no_end_date" />'. |
'<input type="checkbox" name="no_end_date" />'. |
&mt('No end date').'</label></span>'; |
&mt('No end date').'</label></span>'; |
$closure = '1'; |
unless ($hascredits) { |
|
$closure = '1'; |
|
} |
} |
} |
|
|
my %help_item = ( |
my %help_item = ( |
Line 1853 sub print_personnel_menu {
|
Line 2042 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'}; |
$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>'; |
} |
} |
Line 1970 sub sorted_request_history {
|
Line 2160 sub sorted_request_history {
|
my $crstype = $history{'crstype'}; |
my $crstype = $history{'crstype'}; |
my $disposition = $history{'disposition'}; |
my $disposition = $history{'disposition'}; |
my $status = $history{'status'}; |
my $status = $history{'status'}; |
|
my $uniquecode = $history{'code'}; |
if ($action eq 'view') { |
if ($action eq 'view') { |
next if ((exists($history{'status'})) && ($history{'status'} eq 'created')); |
next if ((exists($history{'status'})) && ($history{'status'} eq 'created')); |
} else { |
} else { |
Line 1985 sub sorted_request_history {
|
Line 2176 sub sorted_request_history {
|
$entry = $requestkey.':'.$crstype.':'. |
$entry = $requestkey.':'.$crstype.':'. |
&escape($history{'details'}{'cdescr'}); |
&escape($history{'details'}{'cdescr'}); |
if ($action eq 'log') { |
if ($action eq 'log') { |
$entry .= ':'.$lastupdate.':'; |
$entry .= ':'.$uniquecode.':'.$lastupdate.':'; |
if ($statusinfo{$key} ne '') { |
if ($statusinfo{$key} ne '') { |
$entry .= $statusinfo{$key}; |
$entry .= $statusinfo{$key}; |
} elsif ($status ne '') { |
} elsif ($status ne '') { |
Line 2183 ENDJS
|
Line 2374 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'. |
'Your request will be removed.'); |
&mt('Your request will be removed.'); |
return << "ENDJS"; |
return << "ENDJS"; |
function nextPage(formname,nextstate) { |
function nextPage(formname,nextstate) { |
if (confirm('$alert')) { |
if (confirm('$alert')) { |
Line 2198 ENDJS
|
Line 2389 ENDJS
|
} |
} |
|
|
sub print_request_logs { |
sub print_request_logs { |
my ($r,$dom,$jscript,$loaditems,$crumb) = @_; |
my ($r,$dom,$jscript,$loaditems,$crumb,$usetabs) = @_; |
my $title; |
my $title; |
if ($env{'form.crstype'} eq 'community') { |
if ($env{'form.crstype'} eq 'community') { |
$title = 'Community Request Logs'; |
$title = 'Community Request Logs'; |
Line 2208 sub print_request_logs {
|
Line 2399 sub print_request_logs {
|
$title = 'Course Request Logs'; |
$title = 'Course Request Logs'; |
} |
} |
$r->print(&header($title,$jscript,$loaditems).$crumb); |
$r->print(&header($title,$jscript,$loaditems).$crumb); |
|
if ($usetabs) { |
|
&startContentScreen($r,'textbooklogs'); |
|
} |
my $formname = 'requestcrs'; |
my $formname = 'requestcrs'; |
$r->print('<form action="/adm/requestcourse" method="post" name="'.$formname.'" onsubmit="javascript:setPage(this);">'."\n". |
$r->print('<form action="/adm/requestcourse" method="post" name="'.$formname.'" onsubmit="javascript:setPage(this);">'."\n". |
'<input type="hidden" name="action" value="log" />'."\n". |
'<input type="hidden" name="action" value="log" />'."\n". |
Line 2252 sub print_request_logs {
|
Line 2446 sub print_request_logs {
|
if (($curr{'crstype'} eq 'official') || ($curr{'crstype'} eq 'any')) { |
if (($curr{'crstype'} eq 'official') || ($curr{'crstype'} eq 'any')) { |
$tablehdr .= '<th>'.&mt('Institutional Code').'</th>'; |
$tablehdr .= '<th>'.&mt('Institutional Code').'</th>'; |
} |
} |
|
my $showuniquecode; |
|
my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom); |
|
if (($curr{'status'} eq 'any') || ($curr{'status'} eq 'created')) { |
|
if (ref($domconfig{'requestcourses'}) eq 'HASH') { |
|
if (ref($domconfig{'requestcourses'}{'uniquecode'}) eq 'HASH') { |
|
if ($curr{'crstype'} eq 'any') { |
|
my @types = qw(official unofficial community textbook); |
|
foreach my $type (@types) { |
|
if ($domconfig{'requestcourses'}{'uniquecode'}{$type}) { |
|
$showuniquecode = 1; |
|
last; |
|
} |
|
} |
|
} elsif ($domconfig{'requestcourses'}{'uniquecode'}{$curr{'crstype'}}) { |
|
$showuniquecode = 1; |
|
} |
|
} |
|
} |
|
} |
|
if ($showuniquecode) { |
|
$tablehdr .= '<th>'.&mt('Unique Code').'</th>'; |
|
} |
if ($curr{'status'} eq 'any') { |
if ($curr{'status'} eq 'any') { |
$tablehdr .= '<th>'.&mt('Status').'</th>'; |
$tablehdr .= '<th>'.&mt('Status').'</th>'; |
} elsif ($curr{'status'} eq 'created') { |
} elsif ($curr{'status'} eq 'created') { |
Line 2289 sub print_request_logs {
|
Line 2505 sub print_request_logs {
|
my $showtime = &Apache::lonlocal::locallocaltime($item); |
my $showtime = &Apache::lonlocal::locallocaltime($item); |
if (ref($queue_by_date{$item}) eq 'ARRAY') { |
if (ref($queue_by_date{$item}) eq 'ARRAY') { |
foreach my $request (sort(@{$queue_by_date{$item}})) { |
foreach my $request (sort(@{$queue_by_date{$item}})) { |
my ($key,$crstype,$desc,$timestamp,$status,$instcode) = split(':',$request); |
my ($key,$crstype,$desc,$uniquecode,$timestamp,$status,$instcode) = split(':',$request); |
my ($cdom,$cnum) = split('_',$key); |
my ($cdom,$cnum) = split('_',$key); |
my $output = &Apache::loncommon::start_data_table_row(). |
my $output = &Apache::loncommon::start_data_table_row(). |
'<td>'.$count.'</td>'. |
'<td>'.$count.'</td>'. |
Line 2315 sub print_request_logs {
|
Line 2531 sub print_request_logs {
|
} |
} |
$output .= '<td>'.$showinstcode.'</td>'; |
$output .= '<td>'.$showinstcode.'</td>'; |
} |
} |
|
if ($showuniquecode) { |
|
if ($status eq 'created') { |
|
$output .= '<td>'.$uniquecode.'</td>'; |
|
} else { |
|
$output .= '<td>'.&mt('Not applicable').'</td>'; |
|
} |
|
} |
if ($curr{'status'} eq 'any') { |
if ($curr{'status'} eq 'any') { |
my $statusname = &mt('Unknown status'); |
my $statusname = &mt('Unknown status'); |
if (ref($statusnames) eq 'HASH') { |
if (ref($statusnames) eq 'HASH') { |
Line 2375 ENDSCRIPT
|
Line 2598 ENDSCRIPT
|
&mt('There are no records to display'). |
&mt('There are no records to display'). |
'</p>'); |
'</p>'); |
} |
} |
$r->print('</form>'. |
if ($usetabs) { |
&Apache::loncommon::end_page()); |
$r->print('<input type="hidden" name="tabs" value="on" />'); |
|
} |
|
$r->print('</form>'); |
|
if ($usetabs) { |
|
&endContentScreen($r); |
|
} |
|
$r->print(&Apache::loncommon::end_page()); |
return; |
return; |
} |
} |
|
|
Line 2391 sub reqstatus_names {
|
Line 2620 sub reqstatus_names {
|
rejected => 'Request rejected', |
rejected => 'Request rejected', |
cancelled => 'Request cancelled', |
cancelled => 'Request cancelled', |
); |
); |
if (($crstype eq 'official') || ($crstype eq 'unofficial')) { |
if (($crstype eq 'official') || ($crstype eq 'unofficial') || ($crstype eq 'textbook')) { |
$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 2485 sub requestlog_display_filter {
|
Line 2714 sub requestlog_display_filter {
|
|
|
sub print_review { |
sub print_review { |
my ($dom,$codetitles,$cat_titles,$cat_order,$code_order,$uname,$udom, |
my ($dom,$codetitles,$cat_titles,$cat_order,$code_order,$uname,$udom, |
$disallowed,$disallowmsg) = @_; |
$disallowed,$disallowmsg,$instcredits) = @_; |
my ($types,$typename) = &Apache::loncommon::course_types(); |
my ($types,$typename) = &Apache::loncommon::course_types(); |
my ($owner,$ownername,$owneremail); |
my ($owner,$ownername,$owneremail); |
if ($uname eq '' || $udom eq '') { |
if ($uname eq '' || $udom eq '') { |
Line 2533 sub print_review {
|
Line 2762 sub print_review {
|
} |
} |
} |
} |
} |
} |
|
$inst_headers .= '<th>'.&mt('Credits').'</th>'; |
|
if ($instcredits) { |
|
$inst_values .= '<td>'.$instcredits.'</td>'; |
|
} else { |
|
$inst_values .= '<td>'.$env{'form.coursecredits'}.'</td>'; |
|
} |
if (&Apache::lonnet::auto_run('',$dom)) { |
if (&Apache::lonnet::auto_run('',$dom)) { |
$enrollrow_title = &mt('Enrollment'); |
$enrollrow_title = &mt('Enrollment'); |
$enroll_headers = '<th>'.&mt('Automatic Adds').'</th>'. |
$enroll_headers = '<th>'.&mt('Automatic Adds').'</th>'. |
Line 2602 sub print_review {
|
Line 2837 sub print_review {
|
$section_values .= $xlistinfo; |
$section_values .= $xlistinfo; |
} |
} |
$section_values .= '</table></td>'; |
$section_values .= '</table></td>'; |
|
} elsif (($env{'form.crstype'} eq 'unofficial') || ($env{'form.crstype'} eq 'textbook')) { |
|
$inst_headers .= '<th>'.&mt('Credits').'</th>'; |
|
$inst_values .= '<td>'.$env{'form.coursecredits'}.'</td>'; |
} |
} |
|
|
my %ctxt = &clone_text(); |
my %ctxt = &clone_text(); |
Line 2778 sub courseinfo_form {
|
Line 3016 sub courseinfo_form {
|
community => 'You must provide a (brief) community description.' |
community => 'You must provide a (brief) community description.' |
); |
); |
$lt{'unofficial'} = $lt{'official'}; |
$lt{'unofficial'} = $lt{'official'}; |
|
$lt{'textbook'} = $lt{'official'}; |
my $js_validate = <<"ENDJS"; |
my $js_validate = <<"ENDJS"; |
<script type="text/javascript"> |
<script type="text/javascript"> |
// <![CDATA[' |
// <![CDATA[' |
Line 3097 sub display_navbuttons {
|
Line 3336 sub display_navbuttons {
|
} |
} |
|
|
sub print_request_outcome { |
sub print_request_outcome { |
my ($dom,$codetitles,$code_order) = @_; |
my ($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); |
my $sectotal = $env{'form.sectotal'}; |
my $sectotal = $env{'form.sectotal'}; |
my $crosslisttotal = 0; |
my $crosslisttotal = 0; |
$cnum = $env{'form.cnum'}; |
$cnum = $env{'form.cnum'}; |
Line 3107 sub print_request_outcome {
|
Line 3347 sub print_request_outcome {
|
$output = &mt('Invalid LON-CAPA course number for the new course')."\n"; |
$output = &mt('Invalid LON-CAPA course number for the new course')."\n"; |
return $output; |
return $output; |
} |
} |
|
$crstype = $env{'form.crstype'}; |
%domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom); |
my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom); |
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') { |
$req_notifylist = $domconfig{'requestcourses'}{'notify'}{'approval'}; |
$req_notifylist = $domconfig{'requestcourses'}{'notify'}{'approval'}; |
} |
} |
|
if (ref($domconfig{'requestcourses'}{'uniquecode'}) eq 'HASH') { |
|
$uniquecode = $domconfig{'requestcourses'}{'uniquecode'}{$crstype}; |
|
} |
} |
} |
$now = time; |
$now = time; |
$crstype = $env{'form.crstype'}; |
|
my $ccrole = 'cc'; |
my $ccrole = 'cc'; |
if ($crstype eq 'community') { |
if ($crstype eq 'community') { |
$ccrole = 'co'; |
$ccrole = 'co'; |
Line 3288 sub print_request_outcome {
|
Line 3530 sub print_request_outcome {
|
if (exists($env{'form.instcode'})) { |
if (exists($env{'form.instcode'})) { |
$instcode = $env{'form.instcode'}; |
$instcode = $env{'form.instcode'}; |
} |
} |
|
my $credits; |
|
if ($instcredits) { |
|
$credits = $instcredits; |
|
} elsif (exists($env{'form.coursecredits'})) { |
|
$credits = $env{'form.coursecredits'}; |
|
} |
my $clonecrs = ''; |
my $clonecrs = ''; |
my $clonedom = ''; |
my $clonedom = ''; |
if (($env{'form.cloning'}) && |
if (($env{'form.cloning'}) && |
Line 3315 sub print_request_outcome {
|
Line 3563 sub print_request_outcome {
|
cdescr => $env{'form.cdescr'}, |
cdescr => $env{'form.cdescr'}, |
crstype => $env{'form.crstype'}, |
crstype => $env{'form.crstype'}, |
instcode => $instcode, |
instcode => $instcode, |
|
defaultcredits => $credits, |
|
uniquecode => $uniquecode, |
clonedom => $clonedom, |
clonedom => $clonedom, |
clonecrs => $clonecrs, |
clonecrs => $clonecrs, |
datemode => $env{'form.datemode'}, |
datemode => $env{'form.datemode'}, |
Line 3331 sub print_request_outcome {
|
Line 3581 sub print_request_outcome {
|
accessend => $accessend, |
accessend => $accessend, |
personnel => \%personnel, |
personnel => \%personnel, |
}; |
}; |
my (@inststatuses,$storeresult,$creationresult); |
my ($result,$output) = &process_request($lonhost,$dom,$cnum,$crstype,$now,$details,$instcode, |
|
$req_notifylist,\@instsections,\%domconfig); |
|
return ($result,$output); |
|
} |
|
|
|
sub process_request { |
|
my ($lonhost,$dom,$cnum,$crstype,$now,$details,$instcode,$req_notifylist,$instsections, |
|
$domconfig) = @_; |
|
my (@inststatuses,$storeresult,$creationresult,$output); |
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'}, |
$dom,$crstype,\@inststatuses,\%domconfig); |
$dom,$crstype,\@inststatuses,$domconfig); |
if ($val eq '') { |
if ($val eq '') { |
if ($crstype eq 'official') { |
if ($crstype eq 'official') { |
$output = &mt('You are not permitted to request creation of official courses.'); |
$output = &mt('You are not permitted to request creation of official courses.'); |
Line 3343 sub print_request_outcome {
|
Line 3601 sub print_request_outcome {
|
$output = &mt('You are not permitted to request creation of unofficial courses.'); |
$output = &mt('You are not permitted to request creation of unofficial courses.'); |
} elsif ($crstype eq 'community') { |
} elsif ($crstype eq 'community') { |
$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') { |
|
$output = &mt('You are not permitted to request creation of textbook courses'); |
} 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); |
my %reqhash = ( |
my %reqhash = ( |
reqtime => $now, |
reqtime => $now, |
crstype => $crstype, |
crstype => $crstype, |
Line 3356 sub print_request_outcome {
|
Line 3616 sub print_request_outcome {
|
); |
); |
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'}; |
|
} |
if ($val eq 'autolimit=') { |
if ($val eq 'autolimit=') { |
$disposition = 'process'; |
$disposition = 'process'; |
} elsif ($val =~ /^autolimit=(\d+)$/) { |
} elsif ($val =~ /^autolimit=(\d+)$/) { |
Line 3363 sub print_request_outcome {
|
Line 3628 sub print_request_outcome {
|
$disposition = &check_autolimit($env{'user.name'},$env{'user.domain'}, |
$disposition = &check_autolimit($env{'user.name'},$env{'user.domain'}, |
$dom,$crstype,$limit,\$message); |
$dom,$crstype,$limit,\$message); |
} elsif ($val eq 'validate') { |
} elsif ($val eq 'validate') { |
my ($inststatuslist,$validationchk,$validation); |
my ($inststatuslist,$validationchk,$validation,%custominfo); |
if (@inststatuses > 0) { |
if (@inststatuses > 0) { |
$inststatuslist = join(',',@inststatuses); |
$inststatuslist = join(',',@inststatuses); |
} |
} |
my $instseclist; |
my $instseclist; |
if (@instsections > 0) { |
if (ref($instsections) eq 'ARRAY') { |
$instseclist = join(',',@instsections); |
if (@{$instsections} > 0) { |
|
$instseclist = join(',',@{$instsections}); |
|
} |
|
} |
|
my $preprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'prevalidate',$env{'user.name'}, |
|
$env{'user.domain'},$fullname,$coursedesc); |
|
if (ref($preprocess) 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})) { |
|
@{$custominfo{$key}} = &Apache::loncommon::get_env_multiple($env{'form.'.$key}); |
|
} |
|
} else { |
|
if (exists($env{'form.'.$key})) { |
|
$custominfo{$key} = $env{'form.'.$key}; |
|
} |
|
} |
|
} |
|
} |
} |
} |
$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,\%custominfo); |
if ($validationchk =~ /:/) { |
if ($validationchk =~ /:/) { |
($validation,$message) = split(':',$validationchk); |
($validation,$message) = split(':',$validationchk); |
} else { |
} else { |
Line 3391 sub print_request_outcome {
|
Line 3675 sub print_request_outcome {
|
} |
} |
$reqhash{'disposition'} = $disposition; |
$reqhash{'disposition'} = $disposition; |
$reqstatus = $disposition; |
$reqstatus = $disposition; |
my ($modified,$queued); |
my ($modified,$queued,$coursedesc,$token,%customitems); |
|
unless ($disposition eq 'rejected') { |
|
my $inprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'process',$env{'user.name'}, |
|
$env{'user.domain'},$fullname,$coursedesc); |
|
if (ref($inprocess) eq 'HASH') { |
|
if (ref($inprocess->{'formitems'}) eq 'HASH') { |
|
foreach my $key (keys(%{$inprocess->{'formitems'}})) { |
|
if ($inprocess->{'formitems'}->{$key} eq 'multiple') { |
|
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}; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
if ($disposition eq 'rejected') { |
if ($disposition eq 'rejected') { |
if ($crstype eq 'community') { |
if ($crstype eq 'community') { |
$output = &mt('Your community request was rejected.'); |
$output = &mt('Your community request was rejected.'); |
Line 3404 sub print_request_outcome {
|
Line 3708 sub print_request_outcome {
|
$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); |
my ($logmsg,$newusermsg,$addresult,$enrollcount,$response,$keysmsg,%longroles,$code); |
my $type = 'Course'; |
my $type = 'Course'; |
if ($crstype eq 'community') { |
if ($crstype eq 'community') { |
$type = 'Community'; |
$type = 'Community'; |
Line 3413 sub print_request_outcome {
|
Line 3717 sub print_request_outcome {
|
foreach my $role (@roles) { |
foreach my $role (@roles) { |
$longroles{$role}=&Apache::lonnet::plaintext($role,$type); |
$longroles{$role}=&Apache::lonnet::plaintext($role,$type); |
} |
} |
my $result = &Apache::loncoursequeueadmin::course_creation($dom,$cnum, |
my ($result,$postprocess) = &Apache::loncoursequeueadmin::course_creation($dom,$cnum, |
'autocreate',$details,\$logmsg,\$newusermsg,\$addresult, |
'autocreate',$details,\$logmsg,\$newusermsg,\$addresult, |
\$enrollcount,\$response,\$keysmsg,\%domdefs,\%longroles); |
\$enrollcount,\$response,\$keysmsg,\%domdefs,\%longroles, |
|
\$code,\%customitems); |
if ($result eq 'created') { |
if ($result eq 'created') { |
$disposition = 'created'; |
$disposition = 'created'; |
$reqstatus = 'created'; |
$reqstatus = 'created'; |
Line 3426 sub print_request_outcome {
|
Line 3731 sub print_request_outcome {
|
} else { |
} else { |
$output = '<p>'.&mt('Your course request has been processed and the course has been created.'); |
$output = '<p>'.&mt('Your course request has been processed and the course has been created.'); |
} |
} |
|
if (($code) || ((ref($postprocess) eq 'HASH') && |
|
(($postprocess->{'createdweb'}) || ($postprocess->{'createdmsg'})))) { |
|
$output .= ¬ification_information($disposition,$env{'user.name'}.':'.$env{'user.domain'}, |
|
$dom,$cnum,$now,$code,$postprocess); |
|
} |
|
if ($code) { |
|
$reqhash{'code'} = $code; |
|
} |
$output .= '<br />'.$role_result.'</p>'; |
$output .= '<br />'.$role_result.'</p>'; |
$creationresult = 'created'; |
$creationresult = 'created'; |
} else { |
} else { |
Line 3442 sub print_request_outcome {
|
Line 3755 sub print_request_outcome {
|
} |
} |
} else { |
} else { |
my $requestid = $cnum.'_'.$disposition; |
my $requestid = $cnum.'_'.$disposition; |
my $request = { |
my $request = { |
$requestid => { |
$requestid => { |
timestamp => $now, |
timestamp => $now, |
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 3466 sub print_request_outcome {
|
Line 3780 sub print_request_outcome {
|
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 3477 sub print_request_outcome {
|
Line 3801 sub print_request_outcome {
|
} 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 />'. |
$cnum,$now); |
¬ification_information($disposition,$req_notifylist, |
|
$dom,$cnum,$now); |
|
} |
} else { |
} else { |
$reqstatus = 'domainerror'; |
$reqstatus = 'domainerror'; |
$reqhash{'disposition'} = $disposition; |
$reqhash{'disposition'} = $disposition; |
Line 3491 sub print_request_outcome {
|
Line 3817 sub print_request_outcome {
|
($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'; |
|
} |
|
my $fullname = &Apache::loncommon::plainname($env{'user.name'}, |
|
$env{'user.domain'}); |
|
$postprocess = |
|
&Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,$updateaction,$env{'user.name'}, |
|
$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); |
|
} |
|
} |
|
if ($disposition eq 'approval') { |
|
if ((ref($postprocess) eq 'HASH') && |
|
((ref($postprocess->{'queuedmsg'}) eq 'HASH') || ($postprocess->{'queuedweb'}))) { |
|
¬ification_information($disposition,undef,$dom,$cnum,$now,undef,$postprocess); |
|
} |
|
} elsif ($disposition eq 'pending') { |
|
my $pendingform; |
|
if ($crstype ne 'official') { |
|
$pendingform = &pending_validation_form($dom,$cnum,$crstype,$now,$token, |
|
$lonhost,$env{'form.cdescr'}); |
|
} |
|
if ($pendingform) { |
|
$output .= $pendingform; |
|
} else { |
|
$output .= ¬ification_information($disposition,undef,$dom,$cnum,$now,undef,$postprocess); |
|
} |
} |
} |
$output .= ¬ification_information($disposition,$req_notifylist,$cnum,$now); |
|
} |
} |
if ($validationerror ne '') { |
if ($validationerror ne '') { |
$output .= '<p class="LC_warning">'.&mt('An error occurred validating your request with institutional data sources: [_1].',$validationerror).'</p>'; |
$output .= '<p class="LC_warning">'.&mt('An error occurred validating your request with institutional data sources: [_1].',$validationerror).'</p>'; |
Line 3649 sub update_requestors_roles {
|
Line 4008 sub update_requestors_roles {
|
} |
} |
|
|
sub notification_information { |
sub notification_information { |
my ($disposition,$req_notifylist,$cnum,$now) = @_; |
my ($disposition,$req_notifylist,$dom,$cnum,$now,$code,$postprocess) = @_; |
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 3667 sub notification_information {
|
Line 4026 sub notification_information {
|
} |
} |
if ($req_notifylist) { |
if ($req_notifylist) { |
my $fullname = &Apache::loncommon::plainname($env{'user.name'}, |
my $fullname = &Apache::loncommon::plainname($env{'user.name'}, |
$env{'user.domain'}); |
$env{'user.domain'}); |
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'})",$cnum,$env{'form.cdescr'},$now,'coursereq',$sender); |
&Apache::loncoursequeueadmin::send_selfserve_notification($req_notifylist,"$fullname ($env{'user.name'}:$env{'user.domain'})", |
|
'undef',$env{'form.cdescr'},$now,'coursereq',$sender); |
|
} |
|
if (ref($postprocess) eq 'HASH') { |
|
if (ref($postprocess->{'queuedmsg'}) eq 'ARRAY') { |
|
if (scalar(@{$postprocess->{'queuedmsg'}}) > 0) { |
|
my $recipient = $env{'user.name'}.':'.$env{'user.domain'}; |
|
my $sender = $recipient; |
|
my $addmsg = []; |
|
foreach my $item (@{$postprocess->{'queuedmsg'}}) { |
|
if (ref($item) eq 'HASH') { |
|
if ($item->{'mt'} ne '') { |
|
push(@{$addmsg},$item); |
|
} |
|
} |
|
} |
|
if (scalar(@{$addmsg}) > 0) { |
|
&Apache::loncoursequeueadmin::send_selfserve_notification($recipient,$addmsg,undef, |
|
$env{'form.cdescr'},$now, |
|
'queuedcrsreq',$sender); |
|
} |
|
} |
|
} |
|
if ($postprocess->{'queuedweb'}) { |
|
$output .= $postprocess->{'queuedweb'}; |
|
} |
} |
} |
} 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') { |
|
if (($code) || ((ref($postprocess) eq 'HASH') && |
|
((ref($postprocess->{'createdmsg'}) eq 'ARRAY') || ($postprocess->{'createdweb'})))) { |
|
my $addmsg = []; |
|
my $recipient = $env{'user.name'}.':'.$env{'user.domain'}; |
|
my $sender = $recipient; |
|
if ($code) { |
|
push(@{$addmsg},{ |
|
mt => 'Students can automatically select your course: "[_1]" by entering this code: [_2]', |
|
args => [$env{'form.cdescr'},$code], |
|
}); |
|
$output .= '<p>'. |
|
&mt('Students can automatically select your course by entering this code: [_1].','<b>'.$code.'</b>'). |
|
'<br />'. |
|
&mt('A message has been sent to your LON-CAPA account with this information.'); |
|
if ($address ne '') { |
|
$output.= '<br />'.&mt('An e-mail has also been sent to: [_1] with this code.',$address); |
|
} |
|
$output .= '</p>'; |
|
} |
|
if (ref($postprocess) eq 'HASH') { |
|
if (ref($postprocess->{'createdmsg'}) eq 'ARRAY') { |
|
foreach my $item (@{$postprocess->{'createdmsg'}}) { |
|
if (ref($item) eq 'HASH') { |
|
if ($item->{'mt'} ne '') { |
|
push(@{$addmsg},$item); |
|
} |
|
} |
|
} |
|
} |
|
if ($postprocess->{'createdweb'}) { |
|
$output .= $postprocess->{'createdweb'} |
|
} |
|
} |
|
if (scalar(@{$addmsg}) > 0) { |
|
my $type = 'createdcrsreq'; |
|
if ($code) { |
|
$type = 'uniquecode'; |
|
} |
|
&Apache::loncoursequeueadmin::send_selfserve_notification($recipient,$addmsg,$dom.'_'.$cnum,$env{'form.cdescr'}, |
|
$now,$type,$sender); |
|
} |
|
} |
} else { |
} else { |
$output .= '<div class="LC_warning">'. |
$output .= '<div class="LC_warning">'. |
&mt('Your request status is: [_1].',$disposition). |
&mt('Your request status is: [_1].',$disposition). |
Line 3685 sub notification_information {
|
Line 4121 sub notification_information {
|
return $output; |
return $output; |
} |
} |
|
|
|
sub pending_validation_form { |
|
my ($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 $protocol = $Apache::lonnet::protocol{$lonhost}; |
|
$protocol = 'http' if ($protocol ne 'https'); |
|
my $crscreator = $protocol.'://'.&Apache::lonnet::hostname($lonhost).'/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 3699 sub check_autolimit {
|
Line 4182 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')) && |
} elsif ((($crstype eq 'official') || ($crstype eq 'unofficial') || ($crstype eq 'textbook')) && |
(exists($crsroles{$cnum.':'.$cdom.':cc'}))) { |
(exists($crsroles{$cnum.':'.$cdom.':cc'}))) { |
$count ++; |
$count ++; |
} |
} |
Line 3761 sub retrieve_settings {
|
Line 4244 sub retrieve_settings {
|
$cnum => $reqinfo{'instcode'}, |
$cnum => $reqinfo{'instcode'}, |
}; |
}; |
&extract_instcode($dom,'instcode',$crscode,$cnum); |
&extract_instcode($dom,'instcode',$crscode,$cnum); |
|
(undef,undef,my $instcredits) = |
|
&Apache::lonnet::auto_validate_instcode(undef,$dom, |
|
$reqinfo{'instcode'}); |
|
if ($instcredits ne $reqinfo{'defaultcredits'}) { |
|
$env{'form.coursecredits'} = $reqinfo{'defaultcredits'}; |
|
} |
} |
} |
|
} elsif (($reqinfo{'crstype'} eq 'unofficial') || ($reqinfo{'crstype'} eq 'textbook')) { |
|
$env{'form.coursecredits'} = $reqinfo{'defaultcredits'}; |
} |
} |
my @currsec; |
my @currsec; |
if (ref($reqinfo{'sections'}) eq 'HASH') { |
if (ref($reqinfo{'sections'}) eq 'HASH') { |
Line 3892 sub generate_date_items {
|
Line 4383 sub generate_date_items {
|
return; |
return; |
} |
} |
|
|
|
sub print_textbook_form { |
|
my ($r,$dom,$incdoms,$domdefs,$settings,$can_request) = @_; |
|
my ($bookshash,%ordered); |
|
my $crstype = 'textbook'; |
|
# |
|
# Retrieve list of textbook courses cloneable by user |
|
# |
|
my $numbook; |
|
if (ref($settings) eq 'HASH') { |
|
$bookshash = $settings->{'textbooks'}; |
|
if (ref($bookshash) eq 'HASH') { |
|
foreach my $item (keys(%{$bookshash})) { |
|
my ($clonedom,$clonecrs) = split(/_/,$item); |
|
if (ref($bookshash->{$item}) eq 'HASH') { |
|
my ($clonedom,$clonecrs) = split(/_/,$item); |
|
if (&Apache::loncoursequeueadmin::can_clone_course($env{'user.name'}, |
|
$env{'user.domain'},$clonecrs,$clonedom,$crstype)) { |
|
|
|
my $num = $bookshash->{$item}{'order'}; |
|
$ordered{$num} = $item; |
|
$numbook ++; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
# |
|
# Check if domain has multiple library servers |
|
# |
|
my ($home_server_pick,$numlib) = |
|
&Apache::loncommon::home_server_form_item($dom,'chome', |
|
'default','hide'); |
|
if ($numlib > 1) { |
|
$home_server_pick = &mt('Home Server for Course').': '.$home_server_pick.'<br />'; |
|
} |
|
|
|
# |
|
# Retrieve information about courses owned by user, or in which user has an active or future |
|
# Course Coordinator role |
|
# |
|
my $numcurrent; |
|
my %cloneable = &Apache::lonnet::courseiddump($dom,'.',1,'.',$env{'user.name'}.':'.$env{'user.domain'}, |
|
undef,undef,undef,'Course'); |
|
my %ccroles = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},'userroles', |
|
['active','future'],['cc']); |
|
foreach my $role (keys(%ccroles)) { |
|
my ($cnum,$cdom,$rest) = split(/:/,$role,3); |
|
unless (exists($cloneable{$cdom.'_'.$cnum})) { |
|
my %courseinfo = &Apache::lonnet::coursedescription($cdom.'_'.$cnum,{'one_time' => 1}); |
|
$cloneable{$cdom.'_'.$cnum} = \%courseinfo; |
|
} |
|
} |
|
|
|
my $numcurrent = scalar(keys(%cloneable)); |
|
|
|
my $jscript = &textbook_request_javascript($numbook,$numcurrent); |
|
my %loaditems; |
|
$loaditems{'onload'} = 'javascript:uncheckAllRadio();'; |
|
$r->print(&header('Course Request',$jscript,\%loaditems)); |
|
|
|
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({text=>'Course Request'}); |
|
$r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests')); |
|
|
|
&startContentScreen($r,'textbookrequests'); |
|
# |
|
# Show domain selector form, if required. |
|
# |
|
if (@{$incdoms} > 1) { |
|
my $onchange = 'this.form.submit()'; |
|
$r->print('<form name="domforcourse" method="post" action="/adm/requestcourse">'. |
|
'<div><fieldset><legend>'.&mt('Domain').'</legend>'. |
|
&Apache::loncommon::select_dom_form($dom,'showdom','',1,$onchange,$incdoms). |
|
'</fieldset></form>'); |
|
} |
|
|
|
# |
|
# Course request form |
|
# |
|
|
|
# |
|
# Course Title |
|
# |
|
$r->print('<form name="requestcourse" method="post" action="/adm/requestcourse" onsubmit="return validTextbookReq();">'. |
|
'<div>'. |
|
'<fieldset>'. |
|
'<legend>'.&mt('Course Information').'</legend>'. |
|
'<span class="LC_nobreak">'.&mt('Title').': '. |
|
'<input type="text" size="60" name="cdescr" value="" /></span><br />'. |
|
$home_server_pick.'<br /></fieldset>'. |
|
'</div>'); |
|
|
|
# |
|
# Content source selection, if more than one available |
|
# |
|
if (keys(%cloneable) || keys(%ordered)) { |
|
$r->print('<div>'. |
|
'<fieldset><legend>'.&mt('Course Content').'</legend>'); |
|
if (keys(%ordered)) { |
|
$r->print('<span class="LC_nobreak"><label>'. |
|
'<input type="radio" name="cloning" value="textbook" onclick="javascript:cloneChoice();" />'. |
|
&mt('Load textbook content').'</span>'.(' 'x2).' '); |
|
} |
|
if (keys(%cloneable)) { |
|
$r->print('<span class="LC_nobreak"><label>'. |
|
'<input type="radio" name="cloning" value="existing" onclick="javascript:cloneChoice();" />'. |
|
&mt('Copy one of your courses').'</label></span>'.(' 'x2).' '); |
|
} |
|
$r->print('<span class="LC_nobreak"><label>'. |
|
'<input type="radio" name="cloning" value="none" checked="checked" onclick="javascript:cloneChoice();" />'. |
|
&mt('Empty course shell').'</label></span>'); |
|
} else { |
|
$r->print('<input type="hidden" name="cloning" value="none" />'); |
|
} |
|
|
|
# |
|
# Table of cloneable textbook courses |
|
# |
|
if (keys(%ordered)) { |
|
$r->print('<div id="showtextbook" style="display:none">'. |
|
&Apache::loncommon::start_data_table(). |
|
&Apache::loncommon::start_data_table_header_row(). |
|
'<th>'.&mt('Title').'</th>'. |
|
'<th>'.&mt('Author(s)').'</th>'. |
|
'<th>'.&mt('Subject').'</th>'. |
|
'<th>'.&mt('Book').'</th>'. |
|
&Apache::loncommon::end_data_table_header_row()); |
|
my @items = sort { $a <=> $b } keys(%ordered); |
|
foreach my $num (@items) { |
|
my $item = $ordered{$num}; |
|
my $cleantitle=&HTML::Entities::encode($bookshash->{$item}->{'title'},'<>&"'); |
|
$cleantitle=~s/'/\\'/g; |
|
$cleantitle =~ s/^\s+//; |
|
$r->print(&Apache::loncommon::start_data_table_row(). |
|
'<td><label><input type="radio" name="book" value="'.$item.'" />'. |
|
$cleantitle.'</label></td>'. |
|
'<td>'.$bookshash->{$item}->{'author'}.'</td>'. |
|
'<td>'.$bookshash->{$item}->{'subject'}.'</td>'. |
|
'<td><img border="0" src="'.$bookshash->{$item}->{'image'}. |
|
'" alt="'.$cleantitle.'" /></td>'. |
|
&Apache::loncommon::end_data_table_row()); |
|
} |
|
$r->print(&Apache::loncommon::end_data_table(). |
|
'</div>'); |
|
} |
|
|
|
# |
|
# Table of user's current courses (owner and/or course coordinator) |
|
# |
|
if (keys(%cloneable)) { |
|
my %lt = &clone_text(); |
|
$r->print('<div id="showexisting" style="display:none">'. |
|
&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()); |
|
my %allownernames; |
|
my %sortbytitle; |
|
foreach my $cid (sort(keys(%cloneable))) { |
|
if (ref($cloneable{$cid}) eq 'HASH') { |
|
my $cdesc = $cloneable{$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); |
|
my $singleowner = $cloneable{$cid}{'internal.courseowner'}; |
|
push(@owners,$singleowner); |
|
if ($cloneable{$cid}{'co-owners'} ne '') { |
|
foreach my $item (split(/,/,$cloneable{$cid}{'internal.co-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)); |
|
} |
|
$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 |
|
# |
|
if (keys(%cloneable) || keys(%ordered)) { |
|
$r->print('</fieldset></div>'); |
|
} |
|
|
|
my %accesstitles = ( |
|
'start' => 'Default start access', |
|
'end' => 'Default end access', |
|
); |
|
my %help_item = ( |
|
start => 'Course_Request_Access_Start', |
|
end => 'Course_Request_Access_End', |
|
); |
|
my $starttime = time; |
|
my $endtime = time+(6*30*24*60*60); # 6 months from now, approx |
|
my $startform = &Apache::lonhtmlcommon::date_setter('requestcourse','accessstart', |
|
$starttime,'','','',1,'','','',1); |
|
my $endform = &Apache::lonhtmlcommon::date_setter('requestcourse','accessend', |
|
$endtime,'','','',1,'','','',1); |
|
# |
|
# Set default start and end dates for student access |
|
# |
|
$r->print('<div>'. |
|
'<fieldset><legend>'.&mt('Student Access Dates').'</legend>'. |
|
&Apache::loncommon::help_open_topic($help_item{'start'}). |
|
' '.&mt($accesstitles{'start'}).$startform.'<br />'. |
|
&Apache::loncommon::help_open_topic($help_item{'end'}). |
|
' '.&mt($accesstitles{'end'}).$endform.'<br /></div>'); |
|
|
|
# |
|
# 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 ($postprocess->{'reviewweb'}) { |
|
$r->print($postprocess->{'reviewweb'}); |
|
} |
|
} |
|
|
|
# |
|
# Submit button |
|
# |
|
$r->print('<input type="hidden" name="crstype" value="textbook" />'. |
|
'<input type="hidden" name="action" value="process" />'. |
|
'<input type="submit" value="'.&mt('Create course').'" />'); |
|
|
|
# |
|
# End request form |
|
# |
|
$r->print('</form>'); |
|
&endContentScreen($r). |
|
$r->print(&Apache::loncommon::end_page()); |
|
return; |
|
} |
|
|
|
sub process_textbook_request { |
|
my ($r,$dom,$action,$domdefs,$domconfig,$can_request) = @_; |
|
my ($uniquecode,$req_notifylist); |
|
my $crstype = 'textbook'; |
|
if (ref($domconfig) eq 'HASH') { |
|
if (ref($domconfig->{'requestcourses'}) eq 'HASH') { |
|
if (ref($domconfig->{'requestcourses'}{'notify'}) eq 'HASH') { |
|
$req_notifylist = $domconfig->{'requestcourses'}{'notify'}{'approval'}; |
|
} |
|
if (ref($domconfig->{'requestcourses'}{'uniquecode'}) eq 'HASH') { |
|
$uniquecode = $domconfig->{'requestcourses'}{'uniquecode'}{$crstype}; |
|
} |
|
} |
|
} |
|
my $now = time; |
|
my $reqtype = $env{'form.cloning'}; |
|
my (@inststatuses,$storeresult,$creationresult); |
|
my $cnum = &Apache::lonnet::generate_coursenum($dom,'Course'); |
|
my ($clonefrom,$clonedom,$clonecrs); |
|
if ($reqtype eq 'textbook') { |
|
$clonefrom = $env{'form.book'}; |
|
} elsif ($reqtype eq 'existing') { |
|
$clonefrom = $env{'form.owned'}; |
|
} |
|
my ($accessstart,$accessend) = &dates_from_form('accessstart','accessend'); |
|
if ($clonefrom) { |
|
($clonedom,$clonecrs) = split(/_/,$clonefrom); |
|
if (&Apache::lonnet::homeserver($clonecrs,$clonedom) ne 'no_host') { |
|
my $canclone = |
|
&Apache::loncoursequeueadmin::can_clone_course($env{'user.name'}, |
|
$env{'user.domain'},$clonecrs,$clonedom,$crstype); |
|
unless ($canclone) { |
|
undef($clonecrs); |
|
undef($clonedom); |
|
} |
|
} else { |
|
undef($clonecrs); |
|
undef($clonedom); |
|
} |
|
} |
|
$r->print(&header('Course Creation')); |
|
|
|
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'); |
|
|
|
my $details = { |
|
owner => $env{'user.name'}, |
|
domain => $env{'user.domain'}, |
|
cdom => $dom, |
|
cnum => $cnum, |
|
coursehome => $env{'form.chome'}, |
|
cdescr => $env{'form.cdescr'}, |
|
crstype => $crstype, |
|
uniquecode => $uniquecode, |
|
clonedom => $clonedom, |
|
clonecrs => $clonecrs, |
|
accessstart => $accessstart, |
|
accessend => $accessend, |
|
personnel => {}, |
|
}; |
|
if ($reqtype eq 'existing') { |
|
$details->{datemode} = $env{'form.datemode'}; |
|
$details->{dateshift} = $env{'form.dateshift'}; |
|
} |
|
my $lonhost = $r->dir_config('lonHostID'); |
|
my ($result,$output) = &process_request($lonhost,$dom,$cnum,$crstype,$now,$details,'', |
|
$req_notifylist,[],$domconfig); |
|
$r->print($output); |
|
if (&Apache::loncoursequeueadmin::author_prompt()) { |
|
&print_author_prompt($r,$action,$cnum,$dom,$crstype,$result); |
|
} elsif ($result eq 'created') { |
|
$r->print('<p><a href="/adm/requestcourse">'.&mt('Create another course').'</a></p>'); |
|
} |
|
&endContentScreen($r); |
|
$r->print(&Apache::loncommon::end_page()); |
|
} |
|
|
|
sub textbook_request_javascript { |
|
my ($numbook,$numcurrent) = @_; |
|
my %lt = &Apache::lonlocal::texthash( |
|
choose => 'Please select a content option.', |
|
textbook => 'Please select a textbook, or choose a different option.', |
|
existing => 'Please select one of your existing courses to copy, or choose a different option.', |
|
title => 'Please enter a course title.', |
|
); |
|
return if (!$numbook && !$numcurrent); |
|
return <<"ENDSCRIPT"; |
|
function cloneChoice() { |
|
if (document.requestcourse.cloning) { |
|
var radioLength = document.requestcourse.cloning.length; |
|
if (radioLength == undefined) { |
|
var val = document.requestcourse.cloning.value; |
|
if ((val == 'textbook') || (val == 'existing')) { |
|
var elem = document.getElementById('show'+val); |
|
if (document.requestcourse.cloning.checked) { |
|
elem.style.display = 'block'; |
|
} else { |
|
uncheckRadio(val); |
|
elem.style.display = 'none'; |
|
} |
|
} |
|
} else { |
|
for (var i=0; i<radioLength; i++) { |
|
var val = document.requestcourse.cloning[i].value; |
|
if ((val == 'textbook') || (val == 'existing')) { |
|
var elem = document.getElementById('show'+val); |
|
if (document.requestcourse.cloning[i].checked) { |
|
elem.style.display = 'block'; |
|
} else { |
|
if (val == 'textbook') { |
|
uncheckRadio('book'); |
|
} |
|
if (val == 'existing') { |
|
uncheckRadio('owned'); |
|
} |
|
elem.style.display = 'none'; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
|
|
function uncheckRadio(radioGroupName) { |
|
var group = document.getElementsByName(radioGroupName); |
|
var radioLength = group.length; |
|
if (radioLength == undefined) { |
|
group.checked = false; |
|
} else { |
|
for (var i=0; i<radioLength; i++) { |
|
group[i].checked = false; |
|
} |
|
} |
|
return; |
|
} |
|
|
|
function uncheckAllRadio() { |
|
uncheckRadio('cloning'); |
|
var numbook = $numbook; |
|
var numcurrent = $numcurrent; |
|
if (numbook > 0) { |
|
uncheckRadio('textbook'); |
|
} |
|
if (numcurrent > 0) { |
|
uncheckRadio('existing'); |
|
} |
|
return; |
|
} |
|
|
|
function validTextbookReq() { |
|
if (document.requestcourse.cloning) { |
|
var cloneChoice = 0; |
|
var radioLength = document.requestcourse.cloning.length; |
|
if (radioLength == undefined) { |
|
if (document.requestcourse.cloning.checked == false) { |
|
alert("$lt{'choose'}"); |
|
return false; |
|
} else { |
|
cloneChoice = document.requestcourse.cloning.value; |
|
} |
|
} else { |
|
for (var i=0; i<radioLength; i++) { |
|
if (document.requestcourse.cloning[i].checked) { |
|
cloneChoice = document.requestcourse.cloning[i].value; |
|
break; |
|
} |
|
} |
|
if (cloneChoice == 0) { |
|
alert("$lt{'choose'}"); |
|
return false; |
|
} |
|
} |
|
var group; |
|
if ((cloneChoice == 'textbook') || (cloneChoice == 'existing')) { |
|
var group; |
|
if (cloneChoice == 'textbook') { |
|
group = document.getElementsByName('book'); |
|
} else { |
|
group = document.getElementsByName('owned'); |
|
} |
|
var groupLength = group.length; |
|
var chosen = 0; |
|
if (groupLength == undefined) { |
|
if (group.checked) { |
|
chosen = 1; |
|
} |
|
} else { |
|
for (var j=0; j<groupLength; j++) { |
|
if (group[j].checked) { |
|
chosen = 1; |
|
break; |
|
} |
|
} |
|
} |
|
if (chosen == 0) { |
|
if (cloneChoice == 'textbook') { |
|
alert("$lt{'textbook'}"); |
|
} else { |
|
alert("$lt{'existing'}"); |
|
} |
|
return false; |
|
} |
|
} |
|
} |
|
if (document.requestcourse.cdescr.value == '') { |
|
alert("$lt{'title'}"); |
|
return false; |
|
} |
|
return true; |
|
} |
|
|
|
ENDSCRIPT |
|
|
|
} |
|
|
|
sub startContentScreen { |
|
my ($r,$mode)=@_; |
|
$r->print("\n".'<ul class="LC_TabContentBigger" id="textbookreq">'."\n"); |
|
$r->print('<li'.(($mode eq 'textbookrequests')?' class="active"':'').'><a href="/adm/requestcourse"><b> '.&mt('Request a Course').' </b></a></li>'."\n"); |
|
$r->print('<li'.(($mode eq 'textbooklogs')?' class="active"':'').'><a href="/adm/requestcourse?action=log&crstype=textbook&tabs=on"><b> '.&mt('Course Request History').' </b></a></li>'."\n"); |
|
$r->print("\n".'</ul>'."\n"); |
|
$r->print('<div class="LC_Box" style="clear:both;margin:0;"><div id="mainbox" style="margin:0 0;padding:0 0;"><div class="LC_ContentBox" id="maincontentbox" style="display: block;">'); |
|
} |
|
|
|
sub endContentScreen { |
|
my ($r)=@_; |
|
$r->print('</div></div></div>'); |
|
} |
|
|
1; |
1; |
|
|