version 1.71, 2013/12/25 20:43:46
|
version 1.72, 2013/12/27 14:34:52
|
Line 134 sub handler {
|
Line 134 sub handler {
|
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,$showcredits,$instcredits); |
my ($jscript,$uname,$udom,$result,$warning,$showcredits,$instcredits,%can_request, |
|
%request_domains,@incdoms); |
my %domdefs = &Apache::lonnet::get_domain_defaults($dom); |
my %domdefs = &Apache::lonnet::get_domain_defaults($dom); |
if ($domdefs{'officialcredits'} || $domdefs{'unofficialcredits'} || $domdefs{'textbookcredits'}) { |
if ($domdefs{'officialcredits'} || $domdefs{'unofficialcredits'} || $domdefs{'textbookcredits'}) { |
$showcredits = 1; |
$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 ((scalar(keys(%can_request)) == 1) && ($can_request{'textbook'})) { |
|
my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom); |
|
if ($action eq 'log') { |
|
&Apache::lonhtmlcommon::add_breadcrumb({text=>'Course Request'}); |
|
my $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests'); |
|
&print_request_logs($r,$dom,undef,undef,$crumb); |
|
} elsif ($action eq 'process') { |
|
&process_textbook_request($r,$dom,$action,\%domdefs,\%domconfig); |
|
} else { |
|
&print_textbook_form($r,$dom,\@incdoms,\%domdefs,$domconfig{'requestcourses'}); |
|
} |
|
return OK; |
|
} |
|
} |
|
|
$states{'display'} = ['details']; |
$states{'display'} = ['details']; |
$states{'view'} = ['pick_request','details','cancel','removal']; |
$states{'view'} = ['pick_request','details','cancel','removal']; |
$states{'log'} = ['display']; |
$states{'log'} = ['display']; |
Line 299 sub handler {
|
Line 329 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, |
Line 321 sub handler {
|
Line 348 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,'','','','',$showcredits); |
$loaditems,$crumb,'','','','',$showcredits); |
Line 340 sub handler {
|
Line 367 sub handler {
|
} |
} |
} 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 358 ENDJS
|
Line 385 ENDJS
|
&print_request_logs($r,$dom,$jscript,$loaditems,$crumb); |
&print_request_logs($r,$dom,$jscript,$loaditems,$crumb); |
} |
} |
} 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 683 sub onload_action {
|
Line 710 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 797 END
|
Line 824 END
|
$domaintitle = &mt('Course/Community Domain'); |
$domaintitle = &mt('Course/Community Domain'); |
} |
} |
} |
} |
my @incdoms; |
|
if (ref($request_domains) eq 'HASH') { |
|
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>'. |
'<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 1488 sub print_request_form {
|
Line 1503 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()) { |
$r->print('<h3>'.&mt('Access to authoring space').'</h3>'. |
&print_author_prompt($r,$env{'form.action'},$env{'form.cnum'},$env{'form.showdom'}, |
'<p>'. |
$env{'form.crstype'},$storeresult); |
&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="'.$env{'form.action'}.'" />'. |
|
'<input type="hidden" name="cnum" value="'.$env{'form.cnum'}.'" />'. |
|
'<input type="hidden" name="showdom" value="'.$env{'form.showdom'}.'" />'. |
|
'<input type="hidden" name="crstype" value="'.$env{'form.crstype'}.'" />'. |
|
'<input type="hidden" name="disposition" value="'.$storeresult.'" />'. |
|
'<br />'); |
|
} elsif ($storeresult eq 'created') { |
} elsif ($storeresult eq 'created') { |
$r->print('<p><a href="/adm/requestcourse">'.&mt('Make another request').'</a></p>'); |
$r->print('<p><a href="/adm/requestcourse">'.&mt('Make another request').'</a></p>'); |
} |
} |
Line 1591 sub print_request_form {
|
Line 1589 sub print_request_form {
|
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 3486 sub print_request_outcome {
|
Line 3507 sub print_request_outcome {
|
accessend => $accessend, |
accessend => $accessend, |
personnel => \%personnel, |
personnel => \%personnel, |
}; |
}; |
my (@inststatuses,$storeresult,$creationresult); |
my ($result,$output) = &process_request($dom,$cnum,$crstype,$now,$details,$instcode, |
|
$req_notifylist,\@instsections,\%domconfig); |
|
return ($result,$output); |
|
} |
|
|
|
sub process_request { |
|
my ($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 3525 sub print_request_outcome {
|
Line 3553 sub print_request_outcome {
|
$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}); |
|
} |
} |
} |
$validationchk = |
$validationchk = |
&Apache::lonnet::auto_courserequest_validation($dom, |
&Apache::lonnet::auto_courserequest_validation($dom, |
Line 4079 sub generate_date_items {
|
Line 4109 sub generate_date_items {
|
return; |
return; |
} |
} |
|
|
|
sub print_textbook_form { |
|
my ($r,$dom,$incdoms,$domdefs,$settings) = @_; |
|
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)); |
|
|
|
&Apache::lonhtmlcommon::add_breadcrumb({text=>'Course Request'}); |
|
$r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests')); |
|
|
|
# |
|
# 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>'); |
|
|
|
# |
|
# Submit button |
|
# |
|
$r->print('<input type="hidden" name="action" value="process" />'. |
|
'<input type="submit" value="'.&mt('Create course').'" />'); |
|
|
|
# |
|
# End request form |
|
# |
|
$r->print('</form>'. |
|
&Apache::loncommon::end_page()); |
|
return; |
|
} |
|
|
|
sub process_textbook_request { |
|
my ($r,$dom,$action,$domdefs,$domconfig) = @_; |
|
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 $crstype = 'textbook'; |
|
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')); |
|
|
|
&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')); |
|
|
|
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 ($result,$output) = &process_request($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>'); |
|
} |
|
$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 |
|
|
|
} |
|
|
1; |
1; |
|
|