version 1.1075.2.127.2.9, 2020/05/25 16:46:58
|
version 1.1262, 2016/11/20 21:33:11
|
Line 74 use LONCAPA qw(:DEFAULT :match);
|
Line 74 use LONCAPA qw(:DEFAULT :match);
|
use DateTime::TimeZone; |
use DateTime::TimeZone; |
use DateTime::Locale; |
use DateTime::Locale; |
use Encode(); |
use Encode(); |
|
use Text::Aspell; |
use Authen::Captcha; |
use Authen::Captcha; |
use Captcha::reCAPTCHA; |
use Captcha::reCAPTCHA; |
use JSON::DWIW; |
use JSON::DWIW; |
use LWP::UserAgent; |
use LWP::UserAgent; |
use Crypt::DES; |
use Crypt::DES; |
use DynaLoader; # for Crypt::DES version |
use DynaLoader; # for Crypt::DES version |
use File::Copy(); |
use MIME::Lite; |
use File::Path(); |
use MIME::Types; |
use String::CRC32(); |
|
use Short::URL(); |
|
|
|
# ---------------------------------------------- Designs |
# ---------------------------------------------- Designs |
use vars qw(%defaultdesign); |
use vars qw(%defaultdesign); |
Line 168 sub ssi_with_retries {
|
Line 167 sub ssi_with_retries {
|
# ----------------------------------------------- Filetypes/Languages/Copyright |
# ----------------------------------------------- Filetypes/Languages/Copyright |
my %language; |
my %language; |
my %supported_language; |
my %supported_language; |
|
my %supported_codes; |
my %latex_language; # For choosing hyphenation in <transl..> |
my %latex_language; # For choosing hyphenation in <transl..> |
my %latex_language_bykey; # for choosing hyphenation from metadata |
my %latex_language_bykey; # for choosing hyphenation from metadata |
my %cprtag; |
my %cprtag; |
Line 198 BEGIN {
|
Line 198 BEGIN {
|
{ |
{ |
my $langtabfile = $Apache::lonnet::perlvar{'lonTabDir'}. |
my $langtabfile = $Apache::lonnet::perlvar{'lonTabDir'}. |
'/language.tab'; |
'/language.tab'; |
if ( open(my $fh,'<',$langtabfile) ) { |
if ( open(my $fh,"<$langtabfile") ) { |
while (my $line = <$fh>) { |
while (my $line = <$fh>) { |
next if ($line=~/^\#/); |
next if ($line=~/^\#/); |
chomp($line); |
chomp($line); |
my ($key,$two,$country,$three,$enc,$val,$sup,$latex)=(split(/\t/,$line)); |
my ($key,$code,$country,$three,$enc,$val,$sup,$latex)=(split(/\t/,$line)); |
$language{$key}=$val.' - '.$enc; |
$language{$key}=$val.' - '.$enc; |
if ($sup) { |
if ($sup) { |
$supported_language{$key}=$sup; |
$supported_language{$key}=$sup; |
|
$supported_codes{$key} = $code; |
} |
} |
if ($latex) { |
if ($latex) { |
$latex_language_bykey{$key} = $latex; |
$latex_language_bykey{$key} = $latex; |
$latex_language{$two} = $latex; |
$latex_language{$code} = $latex; |
} |
} |
} |
} |
close($fh); |
close($fh); |
Line 219 BEGIN {
|
Line 220 BEGIN {
|
{ |
{ |
my $copyrightfile = $Apache::lonnet::perlvar{'lonIncludes'}. |
my $copyrightfile = $Apache::lonnet::perlvar{'lonIncludes'}. |
'/copyright.tab'; |
'/copyright.tab'; |
if ( open (my $fh,'<',$copyrightfile) ) { |
if ( open (my $fh,"<$copyrightfile") ) { |
while (my $line = <$fh>) { |
while (my $line = <$fh>) { |
next if ($line=~/^\#/); |
next if ($line=~/^\#/); |
chomp($line); |
chomp($line); |
Line 233 BEGIN {
|
Line 234 BEGIN {
|
{ |
{ |
my $sourcecopyrightfile = $Apache::lonnet::perlvar{'lonIncludes'}. |
my $sourcecopyrightfile = $Apache::lonnet::perlvar{'lonIncludes'}. |
'/source_copyright.tab'; |
'/source_copyright.tab'; |
if ( open (my $fh,'<',$sourcecopyrightfile) ) { |
if ( open (my $fh,"<$sourcecopyrightfile") ) { |
while (my $line = <$fh>) { |
while (my $line = <$fh>) { |
next if ($line =~ /^\#/); |
next if ($line =~ /^\#/); |
chomp($line); |
chomp($line); |
Line 247 BEGIN {
|
Line 248 BEGIN {
|
# -------------------------------------------------------------- default domain designs |
# -------------------------------------------------------------- default domain designs |
my $designdir=$Apache::lonnet::perlvar{'lonTabDir'}.'/lonDomColors'; |
my $designdir=$Apache::lonnet::perlvar{'lonTabDir'}.'/lonDomColors'; |
my $designfile = $designdir.'/default.tab'; |
my $designfile = $designdir.'/default.tab'; |
if ( open (my $fh,'<',$designfile) ) { |
if ( open (my $fh,"<$designfile") ) { |
while (my $line = <$fh>) { |
while (my $line = <$fh>) { |
next if ($line =~ /^\#/); |
next if ($line =~ /^\#/); |
chomp($line); |
chomp($line); |
Line 261 BEGIN {
|
Line 262 BEGIN {
|
{ |
{ |
my $categoryfile = $Apache::lonnet::perlvar{'lonTabDir'}. |
my $categoryfile = $Apache::lonnet::perlvar{'lonTabDir'}. |
'/filecategories.tab'; |
'/filecategories.tab'; |
if ( open (my $fh,'<',$categoryfile) ) { |
if ( open (my $fh,"<$categoryfile") ) { |
while (my $line = <$fh>) { |
while (my $line = <$fh>) { |
next if ($line =~ /^\#/); |
next if ($line =~ /^\#/); |
chomp($line); |
chomp($line); |
my ($extension,$category)=(split(/\s+/,$line,2)); |
my ($extension,$category)=(split(/\s+/,$line,2)); |
push(@{$category_extensions{lc($category)}},$extension); |
push @{$category_extensions{lc($category)}},$extension; |
} |
} |
close($fh); |
close($fh); |
} |
} |
Line 276 BEGIN {
|
Line 277 BEGIN {
|
{ |
{ |
my $typesfile = $Apache::lonnet::perlvar{'lonTabDir'}. |
my $typesfile = $Apache::lonnet::perlvar{'lonTabDir'}. |
'/filetypes.tab'; |
'/filetypes.tab'; |
if ( open (my $fh,'<',$typesfile) ) { |
if ( open (my $fh,"<$typesfile") ) { |
while (my $line = <$fh>) { |
while (my $line = <$fh>) { |
next if ($line =~ /^\#/); |
next if ($line =~ /^\#/); |
chomp($line); |
chomp($line); |
Line 679 if (!Array.prototype.indexOf) {
|
Line 680 if (!Array.prototype.indexOf) {
|
var n = 0; |
var n = 0; |
if (arguments.length > 0) { |
if (arguments.length > 0) { |
n = Number(arguments[1]); |
n = Number(arguments[1]); |
if (n !== n) { // shortcut for verifying if it's NaN |
if (n !== n) { // shortcut for verifying if it is NaN |
n = 0; |
n = 0; |
} else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) { |
} else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) { |
n = (n > 0 || -1) * Math.floor(Math.abs(n)); |
n = (n > 0 || -1) * Math.floor(Math.abs(n)); |
Line 880 sub selectcourse_link {
|
Line 881 sub selectcourse_link {
|
my $linktext = &mt('Select Course'); |
my $linktext = &mt('Select Course'); |
if ($selecttype eq 'Community') { |
if ($selecttype eq 'Community') { |
$linktext = &mt('Select Community'); |
$linktext = &mt('Select Community'); |
|
} elsif ($selecttype eq 'Placement') { |
|
$linktext = &mt('Select Placement Test'); |
} elsif ($selecttype eq 'Course/Community') { |
} elsif ($selecttype eq 'Course/Community') { |
$linktext = &mt('Select Course/Community'); |
$linktext = &mt('Select Course/Community'); |
$type = ''; |
$type = ''; |
Line 915 sub check_uncheck_jscript {
|
Line 918 sub check_uncheck_jscript {
|
function checkAll(field) { |
function checkAll(field) { |
if (field.length > 0) { |
if (field.length > 0) { |
for (i = 0; i < field.length; i++) { |
for (i = 0; i < field.length; i++) { |
if (!field[i].disabled) { |
if (!field[i].disabled) { |
field[i].checked = true; |
field[i].checked = true; |
} |
} |
} |
} |
} else { |
} else { |
if (!field.disabled) { |
if (!field.disabled) { |
field.checked = true; |
field.checked = true; |
} |
} |
} |
} |
Line 996 sub select_datelocale {
|
Line 999 sub select_datelocale {
|
} |
} |
$locale_names{$id} = Encode::encode('UTF-8',$locale_names{$id}); |
$locale_names{$id} = Encode::encode('UTF-8',$locale_names{$id}); |
push(@possibles,$id); |
push(@possibles,$id); |
} |
} |
} |
} |
} |
} |
foreach my $item (sort(@possibles)) { |
foreach my $item (sort(@possibles)) { |
Line 1032 sub select_language {
|
Line 1035 sub select_language {
|
|
|
=pod |
=pod |
|
|
|
|
|
=item * &list_languages() |
|
|
|
Returns an array reference that is suitable for use in language prompters. |
|
Each array element is itself a two element array. The first element |
|
is the language code. The second element a descsriptiuon of the |
|
language itself. This is suitable for use in e.g. |
|
&Apache::edit::select_arg (once dereferenced that is). |
|
|
|
=cut |
|
|
|
sub list_languages { |
|
my @lang_choices; |
|
|
|
foreach my $id (&languageids()) { |
|
my $code = &supportedlanguagecode($id); |
|
if ($code) { |
|
my $selector = $supported_codes{$id}; |
|
my $description = &plainlanguagedescription($id); |
|
push (@lang_choices, [$selector, $description]); |
|
} |
|
} |
|
return \@lang_choices; |
|
} |
|
|
|
=pod |
|
|
=item * &linked_select_forms(...) |
=item * &linked_select_forms(...) |
|
|
linked_select_forms returns a string containing a <script></script> block |
linked_select_forms returns a string containing a <script></script> block |
Line 1064 linked_select_forms takes the following
|
Line 1094 linked_select_forms takes the following
|
=item * $onchangesecond, additional javascript call to execute for an onchange |
=item * $onchangesecond, additional javascript call to execute for an onchange |
event for the second <select> tag |
event for the second <select> tag |
|
|
|
=item * $suffix, to differentiate separate uses of select2data javascript |
|
objects in a page. |
|
|
=back |
=back |
|
|
Below is an example of such a hash. Only the 'text', 'default', and |
Below is an example of such a hash. Only the 'text', 'default', and |
Line 1118 sub linked_select_forms {
|
Line 1151 sub linked_select_forms {
|
$hashref, |
$hashref, |
$menuorder, |
$menuorder, |
$onchangefirst, |
$onchangefirst, |
$onchangesecond |
$onchangesecond, |
|
$suffix |
) = @_; |
) = @_; |
my $second = "document.$formname.$secondselectname"; |
my $second = "document.$formname.$secondselectname"; |
my $first = "document.$formname.$firstselectname"; |
my $first = "document.$formname.$firstselectname"; |
Line 1126 sub linked_select_forms {
|
Line 1160 sub linked_select_forms {
|
my $result = ''; |
my $result = ''; |
$result.='<script type="text/javascript" language="JavaScript">'."\n"; |
$result.='<script type="text/javascript" language="JavaScript">'."\n"; |
$result.="// <![CDATA[\n"; |
$result.="// <![CDATA[\n"; |
$result.="var select2data = new Object();\n"; |
$result.="var select2data${suffix} = new Object();\n"; |
$" = '","'; |
$" = '","'; |
my $debug = ''; |
my $debug = ''; |
foreach my $s1 (sort(keys(%$hashref))) { |
foreach my $s1 (sort(keys(%$hashref))) { |
$result.="select2data.d_$s1 = new Object();\n"; |
$result.="select2data${suffix}['d_$s1'] = new Object();\n"; |
$result.="select2data.d_$s1.def = new String('". |
$result.="select2data${suffix}['d_$s1'].def = new String('". |
$hashref->{$s1}->{'default'}."');\n"; |
$hashref->{$s1}->{'default'}."');\n"; |
$result.="select2data.d_$s1.values = new Array("; |
$result.="select2data${suffix}['d_$s1'].values = new Array("; |
my @s2values = sort(keys( %{ $hashref->{$s1}->{'select2'} } )); |
my @s2values = sort(keys( %{ $hashref->{$s1}->{'select2'} } )); |
if (ref($hashref->{$s1}->{'order'}) eq 'ARRAY') { |
if (ref($hashref->{$s1}->{'order'}) eq 'ARRAY') { |
@s2values = @{$hashref->{$s1}->{'order'}}; |
@s2values = @{$hashref->{$s1}->{'order'}}; |
} |
} |
$result.="\"@s2values\");\n"; |
$result.="\"@s2values\");\n"; |
$result.="select2data.d_$s1.texts = new Array("; |
$result.="select2data${suffix}['d_$s1'].texts = new Array("; |
my @s2texts; |
my @s2texts; |
foreach my $value (@s2values) { |
foreach my $value (@s2values) { |
push(@s2texts, $hashref->{$s1}->{'select2'}->{$value}); |
push @s2texts, $hashref->{$s1}->{'select2'}->{$value}; |
} |
} |
$result.="\"@s2texts\");\n"; |
$result.="\"@s2texts\");\n"; |
} |
} |
$"=' '; |
$"=' '; |
$result.= <<"END"; |
$result.= <<"END"; |
|
|
function select1_changed() { |
function select1${suffix}_changed() { |
// Determine new choice |
// Determine new choice |
var newvalue = "d_" + $first.value; |
var newvalue = "d_" + $first.options[$first.selectedIndex].value; |
// update select2 |
// update select2 |
var values = select2data[newvalue].values; |
var values = select2data${suffix}[newvalue].values; |
var texts = select2data[newvalue].texts; |
var texts = select2data${suffix}[newvalue].texts; |
var select2def = select2data[newvalue].def; |
var select2def = select2data${suffix}[newvalue].def; |
var i; |
var i; |
// out with the old |
// out with the old |
for (i = 0; i < $second.options.length; i++) { |
$second.options.length = 0; |
$second.options[i] = null; |
// in with the new |
} |
|
// in with the nuclear |
|
for (i=0;i<values.length; i++) { |
for (i=0;i<values.length; i++) { |
$second.options[i] = new Option(values[i]); |
$second.options[i] = new Option(values[i]); |
$second.options[i].value = values[i]; |
$second.options[i].value = values[i]; |
Line 1175 function select1_changed() {
|
Line 1207 function select1_changed() {
|
</script> |
</script> |
END |
END |
# output the initial values for the selection lists |
# output the initial values for the selection lists |
$result .= "<select size=\"1\" name=\"$firstselectname\" onchange=\"select1_changed();$onchangefirst\">\n"; |
$result .= "<select size=\"1\" name=\"$firstselectname\" onchange=\"select1${suffix}_changed();$onchangefirst\">\n"; |
my @order = sort(keys(%{$hashref})); |
my @order = sort(keys(%{$hashref})); |
if (ref($menuorder) eq 'ARRAY') { |
if (ref($menuorder) eq 'ARRAY') { |
@order = @{$menuorder}; |
@order = @{$menuorder}; |
Line 1252 sub help_open_topic {
|
Line 1284 sub help_open_topic {
|
$topic=~s/\W/\_/g; |
$topic=~s/\W/\_/g; |
|
|
if (!$stayOnPage) { |
if (!$stayOnPage) { |
if ($env{'browser.mobile'}) { |
$link = "javascript:openMyModal('/adm/help/${filename}.hlp',$width,$height,'yes');"; |
$link = "javascript:openMyModal('/adm/help/${filename}.hlp',$width,$height,'yes');"; |
|
} else { |
|
$link = "javascript:void(open('/adm/help/${filename}.hlp', 'Help_for_$topic', 'menubar=0,toolbar=1,scrollbars=1,width=$width,height=$height,resizable=yes'))"; |
|
} |
|
} elsif ($stayOnPage eq 'popup') { |
} elsif ($stayOnPage eq 'popup') { |
$link = "javascript:void(open('/adm/help/${filename}.hlp', 'Help_for_$topic', 'menubar=0,toolbar=1,scrollbars=1,width=$width,height=$height,resizable=yes'))"; |
$link = "javascript:void(open('/adm/help/${filename}.hlp', 'Help_for_$topic', 'menubar=0,toolbar=1,scrollbars=1,width=$width,height=$height,resizable=yes'))"; |
} else { |
} else { |
Line 1305 sub helpLatexCheatsheet {
|
Line 1333 sub helpLatexCheatsheet {
|
.&help_open_topic('Other_Symbols',&mt('Other Symbols'),$stayOnPage,undef,600) |
.&help_open_topic('Other_Symbols',&mt('Other Symbols'),$stayOnPage,undef,600) |
.'</span>'; |
.'</span>'; |
unless ($not_author) { |
unless ($not_author) { |
$out .= ' <span>' |
$out .= '<span>' |
.&help_open_topic('Authoring_Output_Tags',&mt('Output Tags'),$stayOnPage,undef,600) |
.&help_open_topic('Authoring_Output_Tags',&mt('Output Tags'),$stayOnPage,undef,600) |
.'</span> <span>' |
.'</span> <span>' |
.&help_open_topic('Authoring_Multilingual_Problems',&mt('Languages'),$stayOnPage,undef,600) |
.&help_open_topic('Authoring_Multilingual_Problems',&mt('How to create problems in different languages'),$stayOnPage,undef,600) |
.'</span>'; |
.'</span>'; |
} |
} |
$out .= '</span>'; # End cheatsheet |
$out .= '</span>'; # End cheatsheet |
return $out; |
return $out; |
Line 1372 sub help_open_menu {
|
Line 1400 sub help_open_menu {
|
sub top_nav_help { |
sub top_nav_help { |
my ($text) = @_; |
my ($text) = @_; |
$text = &mt($text); |
$text = &mt($text); |
my $stay_on_page; |
my $stay_on_page = 1; |
unless ($env{'environment.remote'} eq 'on') { |
|
$stay_on_page = 1; |
|
} |
|
my ($link,$banner_link); |
my ($link,$banner_link); |
unless ($env{'request.noversionuri'} =~ m{^/adm/helpmenu}) { |
unless ($env{'request.noversionuri'} =~ m{^/adm/helpmenu}) { |
$link = ($stay_on_page) ? "javascript:helpMenu('display')" |
$link = ($stay_on_page) ? "javascript:helpMenu('display')" |
Line 1405 sub help_menu_js {
|
Line 1431 sub help_menu_js {
|
&Apache::loncommon::start_page('Help Menu', undef, |
&Apache::loncommon::start_page('Help Menu', undef, |
{'frameset' => 1, |
{'frameset' => 1, |
'js_ready' => 1, |
'js_ready' => 1, |
'use_absolute' => $httphost, |
'use_absolute' => $httphost, |
'add_entries' => { |
'add_entries' => { |
'border' => '0', |
'border' => '0', |
'rows' => "110,*",},}); |
'rows' => "110,*",},}); |
my $end_page = |
my $end_page = |
&Apache::loncommon::end_page({'frameset' => 1, |
&Apache::loncommon::end_page({'frameset' => 1, |
Line 1749 RESIZE
|
Line 1775 RESIZE
|
} |
} |
|
|
sub colorfuleditor_js { |
sub colorfuleditor_js { |
|
my $browse_or_search; |
|
my $respath; |
|
my ($cnum,$cdom) = &crsauthor_url(); |
|
if ($cnum) { |
|
$respath = "/res/$cdom/$cnum/"; |
|
my %js_lt = &Apache::lonlocal::texthash( |
|
sunm => 'Sub-directory name', |
|
save => 'Save page to make this permanent', |
|
); |
|
&js_escape(\%js_lt); |
|
$browse_or_search = <<"END"; |
|
|
|
function toggleChooser(form,element,titleid,only,search) { |
|
var disp = 'none'; |
|
if (document.getElementById('chooser_'+element)) { |
|
var curr = document.getElementById('chooser_'+element).style.display; |
|
if (curr == 'none') { |
|
disp='inline'; |
|
if (form.elements['chooser_'+element].length) { |
|
for (var i=0; i<form.elements['chooser_'+element].length; i++) { |
|
form.elements['chooser_'+element][i].checked = false; |
|
} |
|
} |
|
toggleResImport(form,element); |
|
} |
|
document.getElementById('chooser_'+element).style.display = disp; |
|
} |
|
} |
|
|
|
function toggleCrsFile(form,element,numdirs) { |
|
if (document.getElementById('chooser_'+element+'_crsres')) { |
|
var curr = document.getElementById('chooser_'+element+'_crsres').style.display; |
|
if (curr == 'none') { |
|
if (numdirs) { |
|
form.elements['coursepath_'+element].selectedIndex = 0; |
|
if (numdirs > 1) { |
|
window['select1'+element+'_changed'](); |
|
} |
|
} |
|
} |
|
document.getElementById('chooser_'+element+'_crsres').style.display = 'block'; |
|
|
|
} |
|
if (document.getElementById('chooser_'+element+'_upload')) { |
|
document.getElementById('chooser_'+element+'_upload').style.display = 'none'; |
|
if (document.getElementById('uploadcrsres_'+element)) { |
|
document.getElementById('uploadcrsres_'+element).value = ''; |
|
} |
|
} |
|
return; |
|
} |
|
|
|
function toggleCrsUpload(form,element,numcrsdirs) { |
|
if (document.getElementById('chooser_'+element+'_crsres')) { |
|
document.getElementById('chooser_'+element+'_crsres').style.display = 'none'; |
|
} |
|
if (document.getElementById('chooser_'+element+'_upload')) { |
|
var curr = document.getElementById('chooser_'+element+'_upload').style.display; |
|
if (curr == 'none') { |
|
if (numcrsdirs) { |
|
form.elements['crsauthorpath_'+element].selectedIndex = 0; |
|
form.elements['newsubdir_'+element][0].checked = true; |
|
toggleNewsubdir(form,element); |
|
} |
|
} |
|
document.getElementById('chooser_'+element+'_upload').style.display = 'block'; |
|
} |
|
return; |
|
} |
|
|
|
function toggleResImport(form,element) { |
|
var choices = new Array('crsres','upload'); |
|
for (var i=0; i<choices.length; i++) { |
|
if (document.getElementById('chooser_'+element+'_'+choices[i])) { |
|
document.getElementById('chooser_'+element+'_'+choices[i]).style.display = 'none'; |
|
} |
|
} |
|
} |
|
|
|
function toggleNewsubdir(form,element) { |
|
var newsub = form.elements['newsubdir_'+element]; |
|
if (newsub) { |
|
if (newsub.length) { |
|
for (var j=0; j<newsub.length; j++) { |
|
if (newsub[j].checked) { |
|
if (document.getElementById('newsubdirname_'+element)) { |
|
if (newsub[j].value == '1') { |
|
document.getElementById('newsubdirname_'+element).type = "text"; |
|
if (document.getElementById('newsubdir_'+element)) { |
|
document.getElementById('newsubdir_'+element).innerHTML = '<br />$js_lt{sunm}'; |
|
} |
|
} else { |
|
document.getElementById('newsubdirname_'+element).type = "hidden"; |
|
document.getElementById('newsubdirname_'+element).value = ""; |
|
document.getElementById('newsubdir_'+element).innerHTML = ""; |
|
} |
|
} |
|
break; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
function updateCrsFile(form,element) { |
|
var directory = form.elements['coursepath_'+element]; |
|
var filename = form.elements['coursefile_'+element]; |
|
var path = directory.options[directory.selectedIndex].value; |
|
var file = filename.options[filename.selectedIndex].value; |
|
form.elements[element].value = '$respath'; |
|
if (path == '/') { |
|
form.elements[element].value += file; |
|
} else { |
|
form.elements[element].value += path+'/'+file; |
|
} |
|
unClean(); |
|
if (document.getElementById('previewimg_'+element)) { |
|
document.getElementById('previewimg_'+element).src = form.elements[element].value; |
|
var newsrc = document.getElementById('previewimg_'+element).src; |
|
} |
|
if (document.getElementById('showimg_'+element)) { |
|
document.getElementById('showimg_'+element).innerHTML = '($js_lt{save})'; |
|
} |
|
toggleChooser(form,element); |
|
return; |
|
} |
|
|
|
function uploadDone(suffix,name) { |
|
if (name) { |
|
document.forms["lonhomework"].elements[suffix].value = name; |
|
unClean(); |
|
toggleChooser(document.forms["lonhomework"],suffix); |
|
} |
|
} |
|
|
|
\$(document).ready(function(){ |
|
|
|
\$(document).delegate('form :submit', 'click', function( event ) { |
|
if ( \$( this ).hasClass( "LC_uploadcrsres" ) ) { |
|
var buttonId = this.id; |
|
var suffix = buttonId.toString(); |
|
suffix = suffix.replace(/^crsupload_/,''); |
|
event.preventDefault(); |
|
document.lonhomework.target = 'crsupload_target_'+suffix; |
|
document.lonhomework.action = '/adm/coursepub?LC_uploadcrsres='+suffix; |
|
\$(this.form).submit(); |
|
document.lonhomework.target = ''; |
|
if (document.getElementById('crsuploadto_'+suffix)) { |
|
document.lonhomework.action = document.getElementById('crsuploadto_'+suffix).value; |
|
} |
|
return false; |
|
} |
|
}); |
|
}); |
|
END |
|
} |
return <<"COLORFULEDIT" |
return <<"COLORFULEDIT" |
<script type="text/javascript"> |
<script type="text/javascript"> |
// <![CDATA[> |
// <![CDATA[> |
Line 1794 sub colorfuleditor_js {
|
Line 1976 sub colorfuleditor_js {
|
} |
} |
|
|
// only iterate whole storage if nothing to override |
// only iterate whole storage if nothing to override |
if(localStorage.getItem(key) == null){ |
if(localStorage.getItem(key) == null){ |
|
|
// prevent storage from growing large |
// prevent storage from growing large |
if(localStorage.length > 50){ |
if(localStorage.length > 50){ |
var regex_getTimestamp = /^(?:\d)+;/; |
var regex_getTimestamp = /^(?:\d)+;/; |
var oldest_timestamp = regex_getTimestamp.exec(localStorage.key(0)); |
var oldest_timestamp = regex_getTimestamp.exec(localStorage.key(0)); |
var oldest_key; |
var oldest_key; |
|
|
for(var i = 1; i < localStorage.length; i++){ |
for(var i = 1; i < localStorage.length; i++){ |
if (regex_getTimestamp.exec(localStorage.key(i)) < oldest_timestamp) { |
if (regex_getTimestamp.exec(localStorage.key(i)) < oldest_timestamp) { |
oldest_key = localStorage.key(i); |
oldest_key = localStorage.key(i); |
Line 1831 sub colorfuleditor_js {
|
Line 2013 sub colorfuleditor_js {
|
pairs = valueArr[i].split(','); |
pairs = valueArr[i].split(','); |
elements = document.getElementsByName(pairs[0]); |
elements = document.getElementsByName(pairs[0]); |
|
|
for (var j = 0; j < elements.length; j++){ |
for (var j = 0; j < elements.length; j++){ |
elements[j].style.display = pairs[1]; |
elements[j].style.display = pairs[1]; |
if (pairs[1] == "none"){ |
if (pairs[1] == "none"){ |
var regex_id = /([_\\d]+)\$/; |
var regex_id = /([_\\d]+)\$/; |
Line 1844 sub colorfuleditor_js {
|
Line 2026 sub colorfuleditor_js {
|
} |
} |
|
|
function getTagList () { |
function getTagList () { |
|
|
var stringToSearch = document.lonhomework.innerHTML; |
var stringToSearch = document.lonhomework.innerHTML; |
|
|
var ret = new Array(); |
var ret = new Array(); |
Line 1852 sub colorfuleditor_js {
|
Line 2034 sub colorfuleditor_js {
|
var tag_list = stringToSearch.match(regex_findBlock); |
var tag_list = stringToSearch.match(regex_findBlock); |
|
|
if(tag_list != null){ |
if(tag_list != null){ |
for(var i = 0; i < tag_list.length; i++){ |
for(var i = 0; i < tag_list.length; i++){ |
ret.push(tag_list[i].replace(/"/, '')); |
ret.push(tag_list[i].replace(/"/, '')); |
} |
} |
} |
} |
Line 1889 sub colorfuleditor_js {
|
Line 2071 sub colorfuleditor_js {
|
|
|
for(var i = 0; i < tag_list.length; i++){ |
for(var i = 0; i < tag_list.length; i++){ |
elem_list = document.getElementsByName(tag_list[i]); |
elem_list = document.getElementsByName(tag_list[i]); |
|
|
if(elem_list.length > 0){ |
if(elem_list.length > 0){ |
elem = elem_list[0]; |
elem = elem_list[0]; |
break; |
break; |
Line 1912 sub colorfuleditor_js {
|
Line 2094 sub colorfuleditor_js {
|
rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */ |
rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */ |
); |
); |
} |
} |
|
|
function autosize(depth){ |
function autosize(depth){ |
var cmInst = window['cm'+depth]; |
var cmInst = window['cm'+depth]; |
var fitsizeButton = document.getElementById('fitsize'+depth); |
var fitsizeButton = document.getElementById('fitsize'+depth); |
Line 1931 sub colorfuleditor_js {
|
Line 2113 sub colorfuleditor_js {
|
} |
} |
} |
} |
|
|
|
$browse_or_search |
|
|
// ]]> |
// ]]> |
</script> |
</script> |
Line 1979 sub insert_folding_button {
|
Line 2161 sub insert_folding_button {
|
my $curDepth = $Apache::lonxml::curdepth; |
my $curDepth = $Apache::lonxml::curdepth; |
my $lastresource = $env{'request.ambiguous'}; |
my $lastresource = $env{'request.ambiguous'}; |
|
|
return "<input type=\"button\" id=\"folding_btn_$curDepth\" |
return "<input type=\"button\" id=\"folding_btn_$curDepth\" |
value=\"".&mt('Hide')."\" onclick=\"fold_box('$curDepth','$lastresource')\">"; |
value=\"".&mt('Hide')."\" onclick=\"fold_box('$curDepth','$lastresource')\">"; |
} |
} |
|
|
|
sub crsauthor_url { |
|
my ($url) = @_; |
|
if ($url eq '') { |
|
$url = $ENV{'REQUEST_URI'}; |
|
} |
|
my ($cnum,$cdom); |
|
if ($env{'request.course.id'}) { |
|
my ($audom,$auname) = ($url =~ m{^/priv/($match_domain)/($match_name)/}); |
|
if ($audom ne '' && $auname ne '') { |
|
if (($env{'course.'.$env{'request.course.id'}.'.num'} eq $auname) && |
|
($env{'course.'.$env{'request.course.id'}.'.domain'} eq $audom)) { |
|
$cnum = $auname; |
|
$cdom = $audom; |
|
} |
|
} |
|
} |
|
return ($cnum,$cdom); |
|
} |
|
|
|
sub import_crsauthor_form { |
|
my ($form,$firstselectname,$secondselectname,$onchangefirst,$only,$suffix) = @_; |
|
return (0) unless ($env{'request.course.id'}); |
|
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my $crshome = $env{'course.'.$env{'request.course.id'}.'.home'}; |
|
return (0) unless (($cnum ne '') && ($cdom ne '')); |
|
my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'}; |
|
my @ids=&Apache::lonnet::current_machine_ids(); |
|
my ($output,$is_home,$relpath,%subdirs,%files,%selimport_menus); |
|
|
|
if (grep(/^\Q$crshome\E$/,@ids)) { |
|
$is_home = 1; |
|
} |
|
$relpath = "/priv/$cdom/$cnum"; |
|
&Apache::lonnet::recursedirs($is_home,'priv',$londocroot,$relpath,'',\%subdirs,\%files); |
|
my %lt = &Apache::lonlocal::texthash ( |
|
fnam => 'Filename', |
|
dire => 'Directory', |
|
); |
|
my $numdirs = scalar(keys(%files)); |
|
my (%possexts,$singledir,@singledirfiles); |
|
if ($only) { |
|
map { $possexts{$_} = 1; } split(/\s*,\s*/,$only); |
|
} |
|
my (%nonemptydirs,$possdirs); |
|
if ($numdirs > 1) { |
|
my @order; |
|
foreach my $key (sort { lc($a) cmp lc($b) } (keys(%files))) { |
|
if (ref($files{$key}) eq 'HASH') { |
|
my $shown = $key; |
|
if ($key eq '') { |
|
$shown = '/'; |
|
} |
|
my @ordered = (); |
|
foreach my $file (sort { lc($a) cmp lc($b) } (keys(%{$files{$key}}))) { |
|
if ($only) { |
|
my ($ext) = ($file =~ /\.([^.]+)$/); |
|
unless ($possexts{lc($ext)}) { |
|
next; |
|
} |
|
} |
|
$selimport_menus{$key}->{'select2'}->{$file} = $file; |
|
push(@ordered,$file); |
|
} |
|
if (@ordered) { |
|
push(@order,$key); |
|
$nonemptydirs{$key} = 1; |
|
$selimport_menus{$key}->{'text'} = $shown; |
|
$selimport_menus{$key}->{'default'} = ''; |
|
$selimport_menus{$key}->{'select2'}->{''} = ''; |
|
$selimport_menus{$key}->{'order'} = \@ordered; |
|
} |
|
} |
|
} |
|
$possdirs = scalar(keys(%nonemptydirs)); |
|
if ($possdirs > 1) { |
|
my @order = sort { lc($a) cmp lc($b) } (keys(%nonemptydirs)); |
|
$output = $lt{'dire'}. |
|
&linked_select_forms($form,'<br />'. |
|
$lt{'fnam'},'', |
|
$firstselectname,$secondselectname, |
|
\%selimport_menus,\@order, |
|
$onchangefirst,'',$suffix).'<br />'; |
|
} elsif ($possdirs == 1) { |
|
$singledir = (keys(%nonemptydirs))[0]; |
|
if (ref($selimport_menus{$singledir}->{'order'}) eq 'ARRAY') { |
|
@singledirfiles = @{$selimport_menus{$singledir}->{'order'}}; |
|
} |
|
delete($selimport_menus{$singledir}); |
|
} |
|
} elsif ($numdirs == 1) { |
|
$singledir = (keys(%files))[0]; |
|
foreach my $file (sort { lc($a) cmp lc($b) } (keys(%{$files{$singledir}}))) { |
|
if ($only) { |
|
my ($ext) = ($file =~ /\.([^.]+)$/); |
|
unless ($possexts{lc($ext)}) { |
|
next; |
|
} |
|
} |
|
push(@singledirfiles,$file); |
|
} |
|
if (@singledirfiles) { |
|
$possdirs == 1; |
|
} |
|
} |
|
if (($possdirs == 1) && (@singledirfiles)) { |
|
my $showdir = $singledir; |
|
if ($singledir eq '') { |
|
$showdir = '/'; |
|
} |
|
$output = $lt{'dire'}. |
|
'<select name="'.$firstselectname.'">'. |
|
'<option value="'.$singledir.'">'.$showdir.'</option>'."\n". |
|
'</select><br />'. |
|
$lt{'fnam'}.'<select name="'.$secondselectname.'">'."\n". |
|
'<option value="" selected="selected">'.$lt{'se'}.'</option>'."\n"; |
|
foreach my $file (@singledirfiles) { |
|
$output .= '<option value="'.$file.'">'.$file.'</option>'."\n"; |
|
} |
|
$output .= '</select><br />'."\n"; |
|
} |
|
return ($possdirs,$output); |
|
} |
|
|
=pod |
=pod |
|
|
Line 2251 option_name => displayed text. An option
|
Line 2556 option_name => displayed text. An option
|
a javascript onchange item, e.g., onchange="this.form.submit();". |
a javascript onchange item, e.g., onchange="this.form.submit();". |
An optional arg -- $readonly -- if true will cause the select form |
An optional arg -- $readonly -- if true will cause the select form |
to be disabled, e.g., for the case where an instructor has a section- |
to be disabled, e.g., for the case where an instructor has a section- |
specific role, and is viewing/modifying parameters. |
specific role, and is viewing/modifying parameters. |
|
|
See lonrights.pm for an example invocation and use. |
See lonrights.pm for an example invocation and use. |
|
|
Line 2264 sub select_form {
|
Line 2569 sub select_form {
|
if ($onchange) { |
if ($onchange) { |
$onchange = ' onchange="'.$onchange.'"'; |
$onchange = ' onchange="'.$onchange.'"'; |
} |
} |
my $selectform = "<select name=\"$name\" size=\"1\"$onchange>\n"; |
my $disabled; |
|
if ($readonly) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
|
my $selectform = "<select name=\"$name\" size=\"1\"$onchange$disabled>\n"; |
my @keys; |
my @keys; |
if (exists($hashref->{'select_form_order'})) { |
if (exists($hashref->{'select_form_order'})) { |
@keys=@{$hashref->{'select_form_order'}}; |
@keys=@{$hashref->{'select_form_order'}}; |
Line 2450 The optional $incdoms is a reference to
|
Line 2759 The optional $incdoms is a reference to
|
|
|
The optional $excdoms is a reference to an array of domains which will be excluded from the available options. |
The optional $excdoms is a reference to an array of domains which will be excluded from the available options. |
|
|
The optional $disabled argument, if true, adds the disabled attribute to the select tag. |
The optional $disabled argument, if true, adds the disabled attribute to the select tag. |
|
|
=cut |
=cut |
|
|
Line 2471 sub select_dom_form {
|
Line 2780 sub select_dom_form {
|
} |
} |
if ($includeempty) { @domains=('',@domains); } |
if ($includeempty) { @domains=('',@domains); } |
if (ref($excdoms) eq 'ARRAY') { |
if (ref($excdoms) eq 'ARRAY') { |
map { $exclude{$_} = 1; } @{$excdoms}; |
map { $exclude{$_} = 1; } @{$excdoms}; |
} |
} |
my $selectdomain = "<select name=\"$name\" size=\"1\"$onchange$disabled>\n"; |
my $selectdomain = "<select name=\"$name\" size=\"1\"$onchange$disabled>\n"; |
foreach my $dom (@domains) { |
foreach my $dom (@domains) { |
Line 2827 sub authform_nochange {
|
Line 3136 sub authform_nochange {
|
kerb_def_dom => 'MSU.EDU', |
kerb_def_dom => 'MSU.EDU', |
@_, |
@_, |
); |
); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
my $result; |
my $result; |
if (!$authnum) { |
if (!$authnum) { |
$result = &mt('Under your current role you are not permitted to change login settings for this user'); |
$result = &mt('Under your current role you are not permitted to change login settings for this user'); |
Line 3021 sub authform_local {
|
Line 3330 sub authform_local {
|
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
if ($in{'readonly'}) { |
if ($in{'readonly'}) { |
$disabled = ' disabled="disabled"'; |
$disabled = ' disabled="disabled"'; |
} |
} |
if (defined($in{'curr_authtype'})) { |
if (defined($in{'curr_authtype'})) { |
if ($in{'curr_authtype'} eq 'loc') { |
if ($in{'curr_authtype'} eq 'loc') { |
if ($can_assign{'loc'}) { |
if ($can_assign{'loc'}) { |
Line 3091 sub authform_filesystem {
|
Line 3400 sub authform_filesystem {
|
} else { |
} else { |
$result = &mt('Currently Filesystem Authenticated.'); |
$result = &mt('Currently Filesystem Authenticated.'); |
return $result; |
return $result; |
} |
} |
} |
} |
} else { |
} else { |
if ($authnum == 1) { |
if ($authnum == 1) { |
Line 3335 sub get_related_words {
|
Line 3644 sub get_related_words {
|
untie %thesaurus_db; |
untie %thesaurus_db; |
return @Words; |
return @Words; |
} |
} |
|
############################################################### |
|
# |
|
# Spell checking |
|
# |
|
|
=pod |
=pod |
|
|
=back |
=back |
|
|
|
=head1 Spell checking |
|
|
|
=over 4 |
|
|
|
=item * &check_spelling($wordlist $language) |
|
|
|
Takes a string containing words and feeds it to an external |
|
spellcheck program via a pipeline. Returns a string containing |
|
them mis-spelled words. |
|
|
|
Parameters: |
|
|
|
=over 4 |
|
|
|
=item - $wordlist |
|
|
|
String that will be fed into the spellcheck program. |
|
|
|
=item - $language |
|
|
|
Language string that specifies the language for which the spell |
|
check will be performed. |
|
|
|
=back |
|
|
|
=back |
|
|
|
Note: This sub assumes that aspell is installed. |
|
|
|
|
=cut |
=cut |
|
|
|
|
|
sub check_spelling { |
|
my ($wordlist, $language) = @_; |
|
my @misspellings; |
|
|
|
# Generate the speller and set the langauge. |
|
# if explicitly selected: |
|
|
|
my $speller = Text::Aspell->new; |
|
if ($language) { |
|
$speller->set_option('lang', $language); |
|
} |
|
|
|
# Turn the word list into an array of words by splittingon whitespace |
|
|
|
my @words = split(/\s+/, $wordlist); |
|
|
|
foreach my $word (@words) { |
|
if(! $speller->check($word)) { |
|
push(@misspellings, $word); |
|
} |
|
} |
|
return join(' ', @misspellings); |
|
|
|
} |
|
|
# -------------------------------------------------------------- Plaintext name |
# -------------------------------------------------------------- Plaintext name |
=pod |
=pod |
|
|
Line 3805 category
|
Line 4174 category
|
|
|
sub filecategorytypes { |
sub filecategorytypes { |
my ($cat) = @_; |
my ($cat) = @_; |
return @{$category_extensions{lc($cat)}}; |
if (ref($category_extensions{lc($cat)}) eq 'ARRAY') { |
|
return @{$category_extensions{lc($cat)}}; |
|
} else { |
|
return (); |
|
} |
} |
} |
|
|
=pod |
=pod |
Line 3972 Return string with previous attempt on p
|
Line 4345 Return string with previous attempt on p
|
|
|
=item * $usec: section of the desired student |
=item * $usec: section of the desired student |
|
|
=item * $identifier: counter for student (multiple students one problem) or |
=item * $identifier: counter for student (multiple students one problem) or |
problem (one student; whole sequence). |
problem (one student; whole sequence). |
|
|
=back |
=back |
Line 4059 sub get_previous_attempt {
|
Line 4432 sub get_previous_attempt {
|
my (@hidden,@unsolved); |
my (@hidden,@unsolved); |
if (%typeparts) { |
if (%typeparts) { |
foreach my $id (keys(%typeparts)) { |
foreach my $id (keys(%typeparts)) { |
if (($returnhash{$version.':'.$id.'.type'} eq 'anonsurvey') || |
if (($returnhash{$version.':'.$id.'.type'} eq 'anonsurvey') || |
($returnhash{$version.':'.$id.'.type'} eq 'anonsurveycred')) { |
($returnhash{$version.':'.$id.'.type'} eq 'anonsurveycred')) { |
push(@hidden,$id); |
push(@hidden,$id); |
} elsif ($identifier ne '') { |
} elsif ($identifier ne '') { |
Line 4120 sub get_previous_attempt {
|
Line 4493 sub get_previous_attempt {
|
if ($key =~ /\./) { |
if ($key =~ /\./) { |
my $value = $returnhash{$version.':'.$key}; |
my $value = $returnhash{$version.':'.$key}; |
if ($key =~ /\.rndseed$/) { |
if ($key =~ /\.rndseed$/) { |
my ($id) = ($key =~ /^(.+)\.rndseed$/); |
my ($id) = ($key =~ /^(.+)\.[^.]+$/); |
if (exists($returnhash{$version.':'.$id.'.rawrndseed'})) { |
if (exists($returnhash{$version.':'.$id.'.rawrndseed'})) { |
$value = $returnhash{$version.':'.$id.'.rawrndseed'}; |
$value = $returnhash{$version.':'.$id.'.rawrndseed'}; |
} |
} |
Line 4137 sub get_previous_attempt {
|
Line 4510 sub get_previous_attempt {
|
next if ($key =~ /\.foilorder$/); |
next if ($key =~ /\.foilorder$/); |
my $value = $returnhash{$version.':'.$key}; |
my $value = $returnhash{$version.':'.$key}; |
if ($key =~ /\.rndseed$/) { |
if ($key =~ /\.rndseed$/) { |
my ($id) = ($key =~ /^(.+)\.rndseed$/); |
my ($id) = ($key =~ /^(.+)\.[^.]+$/); |
if (exists($returnhash{$version.':'.$id.'.rawrndseed'})) { |
if (exists($returnhash{$version.':'.$id.'.rawrndseed'})) { |
$value = $returnhash{$version.':'.$id.'.rawrndseed'}; |
$value = $returnhash{$version.':'.$id.'.rawrndseed'}; |
} |
} |
Line 4168 sub get_previous_attempt {
|
Line 4541 sub get_previous_attempt {
|
if ($key =~/$regexp$/ && (defined &$gradesub)) { |
if ($key =~/$regexp$/ && (defined &$gradesub)) { |
$value = &$gradesub($value); |
$value = &$gradesub($value); |
} |
} |
$prevattempts.='<td>'.$value.' </td>'; |
$prevattempts.='<td>'. $value.' </td>'; |
} else { |
} else { |
$prevattempts.='<td> </td>'; |
$prevattempts.='<td> </td>'; |
} |
} |
Line 4184 sub get_previous_attempt {
|
Line 4557 sub get_previous_attempt {
|
if ($key =~/$regexp$/ && (defined &$gradesub)) { |
if ($key =~/$regexp$/ && (defined &$gradesub)) { |
$value = &$gradesub($value); |
$value = &$gradesub($value); |
} |
} |
$prevattempts.='<td>'.$value.' </td>'; |
$prevattempts.='<td>'.$value.' </td>'; |
} |
} |
} |
} |
$prevattempts.= &end_data_table_row().&end_data_table(); |
$prevattempts.= &end_data_table_row().&end_data_table(); |
Line 4205 sub get_previous_attempt {
|
Line 4578 sub get_previous_attempt {
|
sub format_previous_attempt_value { |
sub format_previous_attempt_value { |
my ($key,$value) = @_; |
my ($key,$value) = @_; |
if (($key =~ /timestamp/) || ($key=~/duedate/)) { |
if (($key =~ /timestamp/) || ($key=~/duedate/)) { |
$value = &Apache::lonlocal::locallocaltime($value); |
$value = &Apache::lonlocal::locallocaltime($value); |
} elsif (ref($value) eq 'ARRAY') { |
} elsif (ref($value) eq 'ARRAY') { |
$value = '('.join(', ', @{ $value }).')'; |
$value = &HTML::Entities::encode('('.join(', ', @{ $value }).')','"<>&'); |
} elsif ($key =~ /answerstring$/) { |
} elsif ($key =~ /answerstring$/) { |
my %answers = &Apache::lonnet::str2hash($value); |
my %answers = &Apache::lonnet::str2hash($value); |
|
my @answer = %answers; |
|
%answers = map {&HTML::Entities::encode($_, '"<>&')} @answer; |
my @anskeys = sort(keys(%answers)); |
my @anskeys = sort(keys(%answers)); |
if (@anskeys == 1) { |
if (@anskeys == 1) { |
my $answer = $answers{$anskeys[0]}; |
my $answer = $answers{$anskeys[0]}; |
Line 4232 sub format_previous_attempt_value {
|
Line 4607 sub format_previous_attempt_value {
|
} |
} |
} |
} |
} else { |
} else { |
$value = &unescape($value); |
$value = &HTML::Entities::encode(&unescape($value), '"<>&'); |
} |
} |
return $value; |
return $value; |
} |
} |
Line 4616 sub blockcheck {
|
Line 4991 sub blockcheck {
|
# boards, chat or groups, check for blocking in current course only. |
# boards, chat or groups, check for blocking in current course only. |
|
|
if (($activity eq 'boards' || $activity eq 'chat' || |
if (($activity eq 'boards' || $activity eq 'chat' || |
$activity eq 'groups' || $activity eq 'printout' || |
$activity eq 'groups' || $activity eq 'printout') && |
$activity eq 'reinit' || $activity eq 'alert') && |
|
($env{'request.course.id'})) { |
($env{'request.course.id'})) { |
foreach my $key (keys(%live_courses)) { |
foreach my $key (keys(%live_courses)) { |
if ($key ne $env{'request.course.id'}) { |
if ($key ne $env{'request.course.id'}) { |
Line 4701 sub blockcheck {
|
Line 5075 sub blockcheck {
|
$tdom,$spec,$trest,$area); |
$tdom,$spec,$trest,$area); |
} |
} |
} |
} |
my ($author,$adv,$rar) = &Apache::lonnet::set_userprivs(\%userroles,\%allroles); |
my ($author,$adv) = &Apache::lonnet::set_userprivs(\%userroles,\%allroles); |
if ($userroles{'user.priv.'.$checkrole} =~ /evb\&([^\:]*)/) { |
if ($userroles{'user.priv.'.$checkrole} =~ /evb\&([^\:]*)/) { |
if ($1) { |
if ($1) { |
$no_userblock = 1; |
$no_userblock = 1; |
Line 4900 sub blocking_status {
|
Line 5274 sub blocking_status {
|
my $querystring = "?activity=$activity"; |
my $querystring = "?activity=$activity"; |
# $uname and $udom decide whose portfolio the user is trying to look at |
# $uname and $udom decide whose portfolio the user is trying to look at |
if (($activity eq 'port') || ($activity eq 'passwd')) { |
if (($activity eq 'port') || ($activity eq 'passwd')) { |
$querystring .= "&udom=$udom" if ($udom =~ /^$match_domain$/); |
$querystring .= "&udom=$udom" if ($udom =~ /^$match_domain$/); |
$querystring .= "&uname=$uname" if ($uname =~ /^$match_username$/); |
$querystring .= "&uname=$uname" if ($uname =~ /^$match_username$/); |
} elsif ($activity eq 'docs') { |
} elsif ($activity eq 'docs') { |
$querystring .= '&url='.&HTML::Entities::encode($url,'&"'); |
$querystring .= '&url='.&HTML::Entities::encode($url,'&"'); |
Line 4928 END_MYBLOCK
|
Line 5302 END_MYBLOCK
|
$text = &mt('Printing Blocked'); |
$text = &mt('Printing Blocked'); |
} elsif ($activity eq 'passwd') { |
} elsif ($activity eq 'passwd') { |
$text = &mt('Password Changing Blocked'); |
$text = &mt('Password Changing Blocked'); |
} elsif ($activity eq 'alert') { |
|
$text = &mt('Checking Critical Messages Blocked'); |
|
} elsif ($activity eq 'reinit') { |
|
$text = &mt('Checking Course Update Blocked'); |
|
} |
} |
$output .= <<"END_BLOCK"; |
$output .= <<"END_BLOCK"; |
<div class='$class'> |
<div class='$class'> |
Line 4955 sub check_ip_acc {
|
Line 5325 sub check_ip_acc {
|
if (!defined($acc) || $acc =~ /^\s*$/ || $acc =~/^\s*no\s*$/i) { |
if (!defined($acc) || $acc =~ /^\s*$/ || $acc =~/^\s*no\s*$/i) { |
return 1; |
return 1; |
} |
} |
my $allowed=0; |
|
my $ip=$ENV{'REMOTE_ADDR'} || $clientip || $env{'request.host'}; |
|
|
|
my $name; |
|
foreach my $pattern (split(',',$acc)) { |
|
$pattern =~ s/^\s*//; |
|
$pattern =~ s/\s*$//; |
|
if ($pattern =~ /\*$/) { |
|
#35.8.* |
|
$pattern=~s/\*//; |
|
if ($ip =~ /^\Q$pattern\E/) { $allowed=1; } |
|
} elsif ($pattern =~ /(\d+\.\d+\.\d+)\.\[(\d+)-(\d+)\]$/) { |
|
#35.8.3.[34-56] |
|
my $low=$2; |
|
my $high=$3; |
|
$pattern=$1; |
|
if ($ip =~ /^\Q$pattern\E/) { |
|
my $last=(split(/\./,$ip))[3]; |
|
if ($last <=$high && $last >=$low) { $allowed=1; } |
|
} |
|
} elsif ($pattern =~ /^\*/) { |
|
#*.msu.edu |
|
$pattern=~s/\*//; |
|
if (!defined($name)) { |
|
use Socket; |
|
my $netaddr=inet_aton($ip); |
|
($name)=gethostbyaddr($netaddr,AF_INET); |
|
} |
|
if ($name =~ /\Q$pattern\E$/i) { $allowed=1; } |
|
} elsif ($pattern =~ /\d+\.\d+\.\d+\.\d+/) { |
|
#127.0.0.1 |
|
if ($ip =~ /^\Q$pattern\E/) { $allowed=1; } |
|
} else { |
|
#some.name.com |
|
if (!defined($name)) { |
|
use Socket; |
|
my $netaddr=inet_aton($ip); |
|
($name)=gethostbyaddr($netaddr,AF_INET); |
|
} |
|
if ($name =~ /\Q$pattern\E$/i) { $allowed=1; } |
|
} |
|
if ($allowed) { last; } |
|
} |
|
return $allowed; |
|
} |
|
|
|
sub check_slotip_acc { |
|
my ($acc,$clientip)=@_; |
|
&Apache::lonxml::debug("acc is $acc"); |
|
if (!defined($acc) || $acc =~ /^\s*$/ || $acc =~/^\s*no\s*$/i) { |
|
return 1; |
|
} |
|
my $allowed; |
my $allowed; |
my $ip=$ENV{'REMOTE_ADDR'} || $clientip || $env{'request.host'}; |
my $ip=$ENV{'REMOTE_ADDR'} || $clientip || $env{'request.host'}; |
|
|
Line 5031 sub check_slotip_acc {
|
Line 5349 sub check_slotip_acc {
|
my $numallows = scalar(@allows); |
my $numallows = scalar(@allows); |
my $count = 0; |
my $count = 0; |
foreach my $pattern (@denies,@allows) { |
foreach my $pattern (@denies,@allows) { |
$count ++; |
$count ++; |
my $acctype = 'allowfrom'; |
my $acctype = 'allowfrom'; |
if ($count <= $numdenies) { |
if ($count <= $numdenies) { |
$acctype = 'denyfrom'; |
$acctype = 'denyfrom'; |
Line 5142 sub get_domainconf {
|
Line 5460 sub get_domainconf {
|
my $server = $domconfig{'login'}{'loginvia'}{$hostname}{'server'}; |
my $server = $domconfig{'login'}{'loginvia'}{$hostname}{'server'}; |
$designhash{$udom.'.login.loginvia'} = $server; |
$designhash{$udom.'.login.loginvia'} = $server; |
if ($domconfig{'login'}{'loginvia'}{$hostname}{'serverpath'} eq 'custom') { |
if ($domconfig{'login'}{'loginvia'}{$hostname}{'serverpath'} eq 'custom') { |
|
|
$designhash{$udom.'.login.loginvia_'.$hostname} = $server.':'.$domconfig{'login'}{'loginvia'}{$hostname}{'custompath'}; |
$designhash{$udom.'.login.loginvia_'.$hostname} = $server.':'.$domconfig{'login'}{'loginvia'}{$hostname}{'custompath'}; |
} else { |
} else { |
$designhash{$udom.'.login.loginvia_'.$hostname} = $server.':'.$domconfig{'login'}{'loginvia'}{$hostname}{'serverpath'}; |
$designhash{$udom.'.login.loginvia_'.$hostname} = $server.':'.$domconfig{'login'}{'loginvia'}{$hostname}{'serverpath'}; |
Line 5222 sub get_legacy_domconf {
|
Line 5541 sub get_legacy_domconf {
|
my $designdir=$Apache::lonnet::perlvar{'lonTabDir'}.'/lonDomColors'; |
my $designdir=$Apache::lonnet::perlvar{'lonTabDir'}.'/lonDomColors'; |
my $designfile = $designdir.'/'.$udom.'.tab'; |
my $designfile = $designdir.'/'.$udom.'.tab'; |
if (-e $designfile) { |
if (-e $designfile) { |
if ( open (my $fh,'<',$designfile) ) { |
if ( open (my $fh,"<$designfile") ) { |
while (my $line = <$fh>) { |
while (my $line = <$fh>) { |
next if ($line =~ /^\#/); |
next if ($line =~ /^\#/); |
chomp($line); |
chomp($line); |
Line 5411 sub CSTR_pageheader {
|
Line 5730 sub CSTR_pageheader {
|
$lastitem = $thisdisfn; |
$lastitem = $thisdisfn; |
} |
} |
|
|
|
my ($crsauthor,$title); |
|
if (($env{'request.course.id'}) && |
|
($env{'course.'.$env{'request.course.id'}.'.num'} eq $uname) && |
|
($env{'course.'.$env{'request.course.id'}.'.domain'} eq $udom)) { |
|
$crsauthor = 1; |
|
$title = &mt('Course Authoring Space'); |
|
} else { |
|
$title = &mt('Authoring Space'); |
|
} |
|
|
my $output = |
my $output = |
'<div>' |
'<div>' |
.&Apache::loncommon::help_open_menu('','',3,'Authoring') #FIXME: Broken? Where is it? |
.&Apache::loncommon::help_open_menu('','',3,'Authoring') #FIXME: Broken? Where is it? |
.'<b>'.&mt('Authoring Space:').'</b> ' |
.'<b>'.$title.'</b> ' |
.'<form name="dirs" method="post" action="'.$formaction |
.'<form name="dirs" method="post" action="'.$formaction |
.'" target="_top">' #FIXME lonpubdir: target="_parent" |
.'" target="_top">' #FIXME lonpubdir: target="_parent" |
.&Apache::lonhtmlcommon::crumbs($uname.'/'.$parentpath,'_top','/priv/'.$udom,undef,undef); |
.&Apache::lonhtmlcommon::crumbs($uname.'/'.$parentpath,'_top','/priv/'.$udom,undef,undef); |
Line 5425 sub CSTR_pageheader {
|
Line 5754 sub CSTR_pageheader {
|
.$lastitem |
.$lastitem |
.'</span>'; |
.'</span>'; |
} |
} |
$output .= |
|
'<br />' |
if ($crsauthor) { |
#FIXME lonpubdir: &Apache::lonhtmlcommon::crumbs($uname.$thisdisfn.'/','_top','/priv','','+1',1)."</b></tt><br />" |
$output .= '</form>'.&Apache::lonmenu::constspaceform(); |
.&Apache::lonhtmlcommon::select_recent('construct','recent','this.form.action=this.form.recent.value;this.form.submit()') |
} else { |
.'</form>' |
$output .= |
.&Apache::lonmenu::constspaceform() |
'<br />' |
.'</div>'; |
#FIXME lonpubdir: &Apache::lonhtmlcommon::crumbs($uname.$thisdisfn.'/','_top','/priv','','+1',1)."</b></tt><br />" |
|
.&Apache::lonhtmlcommon::select_recent('construct','recent','this.form.action=this.form.recent.value;this.form.submit()') |
|
.'</form>' |
|
.&Apache::lonmenu::constspaceform(); |
|
} |
|
$output .= '</div>'; |
|
|
return $output; |
return $output; |
} |
} |
Line 5473 Inputs:
|
Line 5807 Inputs:
|
|
|
=item * $bgcolor, used to override the bgcolor on a webpage to a specific value |
=item * $bgcolor, used to override the bgcolor on a webpage to a specific value |
|
|
=item * $no_inline_link, if true and in remote mode, don't show the |
|
'Switch To Inline Menu' link |
|
|
|
=item * $args, optional argument valid values are |
=item * $args, optional argument valid values are |
no_auto_mt_title -> prevents &mt()ing the title arg |
no_auto_mt_title -> prevents &mt()ing the title arg |
|
|
Line 5494 other decorations will be returned.
|
Line 5825 other decorations will be returned.
|
|
|
sub bodytag { |
sub bodytag { |
my ($title,$function,$addentries,$bodyonly,$domain,$forcereg, |
my ($title,$function,$addentries,$bodyonly,$domain,$forcereg, |
$no_nav_bar,$bgcolor,$no_inline_link,$args,$advtoolsref)=@_; |
$no_nav_bar,$bgcolor,$args,$advtoolsref)=@_; |
|
|
my $public; |
my $public; |
if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public')) |
if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public')) |
Line 5531 sub bodytag {
|
Line 5862 sub bodytag {
|
if ($env{'request.role'} !~ /^cr/) { |
if ($env{'request.role'} !~ /^cr/) { |
$role = &Apache::lonnet::plaintext($role,&course_type()); |
$role = &Apache::lonnet::plaintext($role,&course_type()); |
} elsif ($role =~ m{^cr/($match_domain)/\1-domainconfig/(\w+)$}) { |
} elsif ($role =~ m{^cr/($match_domain)/\1-domainconfig/(\w+)$}) { |
if ($env{'request.role.desc'}) { |
$role = &mt('Helpdesk[_1]',' '.$2); |
$role = $env{'request.role.desc'}; |
|
} else { |
|
$role = &mt('Helpdesk[_1]',' '.$2); |
|
} |
|
} else { |
} else { |
$role = (split(/\//,$role,4))[-1]; |
$role = (split(/\//,$role,4))[-1]; |
} |
} |
if ($env{'request.course.sec'}) { |
if ($env{'request.course.sec'}) { |
$role .= (' 'x2).'- '.&mt('section:').' '.$env{'request.course.sec'}; |
$role .= (' 'x2).'- '.&mt('section:').' '.$env{'request.course.sec'}; |
Line 5577 sub bodytag {
|
Line 5904 sub bodytag {
|
$dc_info =~ s/\s+$//; |
$dc_info =~ s/\s+$//; |
} |
} |
|
|
$role = '<span class="LC_nobreak">('.$role.')</span>' if ($role && !$env{'browser.mobile'}); |
my $crstype; |
|
if ($env{'request.course.id'}) { |
if ($env{'request.state'} eq 'construct') { $forcereg=1; } |
$crstype = $env{'course.'.$env{'request.course.id'}.'.type'}; |
|
} elsif ($args->{'crstype'}) { |
|
$crstype = $args->{'crstype'}; |
|
} |
my $funclist; |
if (($crstype eq 'Placement') && (!$env{'request.role.adv'})) { |
if (($env{'environment.remote'} eq 'on') && ($env{'request.state'} ne 'construct')) { |
undef($role); |
$bodytag .= Apache::lonhtmlcommon::scripttag(Apache::lonmenu::utilityfunctions($httphost), 'start')."\n". |
|
Apache::lonmenu::serverform(); |
|
my $forbodytag; |
|
&Apache::lonmenu::prepare_functions($env{'request.noversionuri'}, |
|
$forcereg,$args->{'group'}, |
|
$args->{'bread_crumbs'}, |
|
$advtoolsref,'',\$forbodytag); |
|
unless (ref($args->{'bread_crumbs'}) eq 'ARRAY') { |
|
$funclist = $forbodytag; |
|
} |
|
} else { |
} else { |
|
$role = '<span class="LC_nobreak">('.$role.')</span>' if ($role && !$env{'browser.mobile'}); |
|
} |
|
|
|
if ($env{'request.state'} eq 'construct') { $forcereg=1; } |
|
|
# if ($env{'request.state'} eq 'construct') { |
# if ($env{'request.state'} eq 'construct') { |
# $titleinfo = &CSTR_pageheader(); #FIXME: Will be removed once all scripts have their own calls |
# $titleinfo = &CSTR_pageheader(); #FIXME: Will be removed once all scripts have their own calls |
Line 5604 sub bodytag {
|
Line 5925 sub bodytag {
|
$bodytag .= Apache::lonhtmlcommon::scripttag( |
$bodytag .= Apache::lonhtmlcommon::scripttag( |
Apache::lonmenu::utilityfunctions($httphost), 'start'); |
Apache::lonmenu::utilityfunctions($httphost), 'start'); |
|
|
my ($left,$right) = Apache::lonmenu::primary_menu(); |
my ($left,$right) = Apache::lonmenu::primary_menu($crstype); |
|
|
if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { |
if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { |
if ($dc_info) { |
if ($dc_info) { |
$dc_info = qq|<span class="LC_cusr_subheading">$dc_info</span>|; |
$dc_info = qq|<span class="LC_cusr_subheading">$dc_info</span>|; |
} |
} |
$bodytag .= qq|<div id="LC_nav_bar">$left $role<br /> |
$bodytag .= qq|<div id="LC_nav_bar">$left $role<br /> |
<em>$realm</em> $dc_info</div>|; |
<em>$realm</em> $dc_info</div>|; |
return $bodytag; |
return $bodytag; |
} |
} |
|
|
Line 5626 sub bodytag {
|
Line 5947 sub bodytag {
|
} |
} |
$bodytag .= qq|<div id="LC_realm">$realm $dc_info</div>|; |
$bodytag .= qq|<div id="LC_realm">$realm $dc_info</div>|; |
|
|
#if directed to not display the secondary menu, don't. |
#if directed to not display the secondary menu, don't. |
if ($args->{'no_secondary_menu'}) { |
if ($args->{'no_secondary_menu'}) { |
return $bodytag; |
return $bodytag; |
} |
} |
Line 5643 sub bodytag {
|
Line 5964 sub bodytag {
|
$args->{'group'}, |
$args->{'group'}, |
$args->{'hide_buttons'}); |
$args->{'hide_buttons'}); |
} else { |
} else { |
my $forbodytag; |
$bodytag .= |
&Apache::lonmenu::prepare_functions($env{'request.noversionuri'}, |
&Apache::lonmenu::prepare_functions($env{'request.noversionuri'}, |
$forcereg,$args->{'group'}, |
$forcereg,$args->{'group'}, |
$args->{'bread_crumbs'}, |
$args->{'bread_crumbs'}, |
$advtoolsref,'',\$forbodytag); |
$advtoolsref); |
unless (ref($args->{'bread_crumbs'}) eq 'ARRAY') { |
|
$bodytag .= $forbodytag; |
|
} |
|
} |
} |
}else{ |
}else{ |
# this is to seperate menu from content when there's no secondary |
# this is to seperate menu from content when there's no secondary |
Line 5660 sub bodytag {
|
Line 5978 sub bodytag {
|
} |
} |
|
|
return $bodytag; |
return $bodytag; |
} |
|
|
|
# |
|
# Top frame rendering, Remote is up |
|
# |
|
|
|
my $imgsrc = $img; |
|
if ($img =~ /^\/adm/) { |
|
$imgsrc = &lonhttpdurl($img); |
|
} |
|
my $upperleft='<img src="'.$imgsrc.'" alt="'.$function.'" />'; |
|
|
|
my $help=($no_inline_link?'' |
|
:&Apache::loncommon::top_nav_help('Help')); |
|
|
|
# Explicit link to get inline menu |
|
my $menu= ($no_inline_link?'' |
|
:'<a href="/adm/remote?action=collapse" target="_top">'.&mt('Switch to Inline Menu Mode').'</a>'); |
|
|
|
if ($dc_info) { |
|
$dc_info = qq|<span class="LC_cusr_subheading">($dc_info)</span>|; |
|
} |
|
|
|
my $name = &plainname($env{'user.name'},$env{'user.domain'}); |
|
unless ($public) { |
|
$name = &aboutmewrapper($name,$env{'user.name'},$env{'user.domain'}, |
|
undef,'LC_menubuttons_link'); |
|
} |
|
|
|
unless ($env{'form.inhibitmenu'}) { |
|
$bodytag .= qq|<div id="LC_nav_bar">$name $role</div> |
|
<ol class="LC_primary_menu LC_floatright LC_right"> |
|
<li>$help</li> |
|
<li>$menu</li> |
|
</ol><div id="LC_realm"> $realm $dc_info</div>|; |
|
} |
|
if ($env{'request.state'} eq 'construct') { |
|
if (!$public){ |
|
if ($env{'request.state'} eq 'construct') { |
|
$funclist = &Apache::lonhtmlcommon::scripttag( |
|
&Apache::lonmenu::utilityfunctions($httphost), 'start'). |
|
&Apache::lonhtmlcommon::scripttag('','end'). |
|
&Apache::lonmenu::innerregister($forcereg, |
|
$args->{'bread_crumbs'}); |
|
} |
|
} |
|
} |
|
return $bodytag."\n".$funclist; |
|
} |
} |
|
|
sub dc_courseid_toggle { |
sub dc_courseid_toggle { |
Line 5739 sub make_attr_string {
|
Line 6009 sub make_attr_string {
|
delete($attr_ref->{$key}); |
delete($attr_ref->{$key}); |
} |
} |
} |
} |
if ($env{'environment.remote'} eq 'on') { |
$attr_ref->{'onload'} = $on_load; |
$attr_ref->{'onload'} = |
$attr_ref->{'onunload'}= $on_unload; |
&Apache::lonmenu::loadevents(). $on_load; |
|
$attr_ref->{'onunload'}= |
|
&Apache::lonmenu::unloadevents().$on_unload; |
|
} else { |
|
$attr_ref->{'onload'} = $on_load; |
|
$attr_ref->{'onunload'}= $on_unload; |
|
} |
|
} |
} |
|
|
my $attr_string; |
my $attr_string; |
Line 6071 ul.LC_breadcrumb_tools_outerlist li {
|
Line 6334 ul.LC_breadcrumb_tools_outerlist li {
|
float: right; |
float: right; |
} |
} |
|
|
|
.LC_placement_prog { |
|
padding-right: 20px; |
|
font-weight: bold; |
|
font-size: 90%; |
|
} |
|
|
table#LC_title_bar td { |
table#LC_title_bar td { |
background: $tabbg; |
background: $tabbg; |
} |
} |
Line 7129 ol.LC_primary_menu li {
|
Line 7398 ol.LC_primary_menu li {
|
line-height: 1.5em; |
line-height: 1.5em; |
} |
} |
|
|
ol.LC_primary_menu li a, |
ol.LC_primary_menu li a, |
ol.LC_primary_menu li p { |
ol.LC_primary_menu li p { |
display: block; |
display: block; |
margin: 0; |
margin: 0; |
Line 7144 ol.LC_primary_menu li p span.LC_primary_
|
Line 7413 ol.LC_primary_menu li p span.LC_primary_
|
} |
} |
|
|
ol.LC_primary_menu li p span.LC_primary_menu_innerarrow { |
ol.LC_primary_menu li p span.LC_primary_menu_innerarrow { |
display: inline-block; |
display: inline-block; |
width: 5%; |
width: 5%; |
float: right; |
float: right; |
text-align: right; |
text-align: right; |
Line 7179 ol.LC_primary_menu li:hover li, ol.LC_pr
|
Line 7448 ol.LC_primary_menu li:hover li, ol.LC_pr
|
float: none; |
float: none; |
border-left: 1px solid black; |
border-left: 1px solid black; |
border-right: 1px solid black; |
border-right: 1px solid black; |
/* A dark bottom border to visualize different menu options; |
/* A dark bottom border to visualize different menu options; |
overwritten in the create_submenu routine for the last border-bottom of the menu */ |
overwritten in the create_submenu routine for the last border-bottom of the menu */ |
border-bottom: 1px solid $data_table_dark; |
border-bottom: 1px solid $data_table_dark; |
} |
} |
|
|
ol.LC_primary_menu li li p:hover { |
ol.LC_primary_menu li li p:hover { |
Line 7742 ul.LC_funclist li {
|
Line 8011 ul.LC_funclist li {
|
} |
} |
|
|
/* |
/* |
|
styles used for response display |
|
*/ |
|
div.LC_radiofoil, div.LC_rankfoil { |
|
margin: .5em 0em .5em 0em; |
|
} |
|
table.LC_itemgroup { |
|
margin-top: 1em; |
|
} |
|
|
|
/* |
styles used by TTH when "Default set of options to pass to tth/m |
styles used by TTH when "Default set of options to pass to tth/m |
when converting TeX" in course settings has been set |
when converting TeX" in course settings has been set |
|
|
Line 7762 span.roman {font-family: serif; font-sty
|
Line 8041 span.roman {font-family: serif; font-sty
|
span.overacc2 {position: relative; left: .8em; top: -1.2ex;} |
span.overacc2 {position: relative; left: .8em; top: -1.2ex;} |
span.overacc1 {position: relative; left: .6em; top: -1.2ex;} |
span.overacc1 {position: relative; left: .6em; top: -1.2ex;} |
|
|
#LC_minitab_header { |
/* |
float:left; |
sections with roles, for content only |
width:100%; |
*/ |
background:#DAE0D2 url("/res/adm/pages/minitabmenu_bg.gif") repeat-x bottom; |
section[class^="role-"] { |
font-size:93%; |
padding-left: 10px; |
line-height:normal; |
padding-right: 5px; |
margin: 0.5em 0 0.5em 0; |
margin-top: 8px; |
} |
margin-bottom: 8px; |
#LC_minitab_header ul { |
border: 1px solid #2A4; |
margin:0; |
border-radius: 5px; |
padding:10px 10px 0; |
box-shadow: 0px 1px 1px #BBB; |
list-style:none; |
|
} |
} |
#LC_minitab_header li { |
section[class^="role-"]>h1 { |
float:left; |
position: relative; |
background:url("/res/adm/pages/minitabmenu_left.gif") no-repeat left top; |
margin: 0px; |
margin:0; |
padding-top: 10px; |
padding:0 0 0 9px; |
padding-left: 40px; |
} |
} |
#LC_minitab_header a { |
section[class^="role-"]>h1:before { |
display:block; |
position: absolute; |
background:url("/res/adm/pages/minitabmenu_right.gif") no-repeat right top; |
left: -5px; |
padding:5px 15px 4px 6px; |
top: 5px; |
} |
} |
#LC_minitab_header #LC_current_minitab { |
section.role-activity>h1:before { |
background-image:url("/res/adm/pages/minitabmenu_left_on.gif"); |
content:url('/adm/daxe/images/section_icons/activity.png'); |
} |
} |
#LC_minitab_header #LC_current_minitab a { |
section.role-advice>h1:before { |
background-image:url("/res/adm/pages/minitabmenu_right_on.gif"); |
content:url('/adm/daxe/images/section_icons/advice.png'); |
padding-bottom:5px; |
} |
|
section.role-bibliography>h1:before { |
|
content:url('/adm/daxe/images/section_icons/bibliography.png'); |
|
} |
|
section.role-citation>h1:before { |
|
content:url('/adm/daxe/images/section_icons/citation.png'); |
|
} |
|
section.role-conclusion>h1:before { |
|
content:url('/adm/daxe/images/section_icons/conclusion.png'); |
|
} |
|
section.role-definition>h1:before { |
|
content:url('/adm/daxe/images/section_icons/definition.png'); |
|
} |
|
section.role-demonstration>h1:before { |
|
content:url('/adm/daxe/images/section_icons/demonstration.png'); |
|
} |
|
section.role-example>h1:before { |
|
content:url('/adm/daxe/images/section_icons/example.png'); |
|
} |
|
section.role-explanation>h1:before { |
|
content:url('/adm/daxe/images/section_icons/explanation.png'); |
|
} |
|
section.role-introduction>h1:before { |
|
content:url('/adm/daxe/images/section_icons/introduction.png'); |
|
} |
|
section.role-method>h1:before { |
|
content:url('/adm/daxe/images/section_icons/method.png'); |
|
} |
|
section.role-more_information>h1:before { |
|
content:url('/adm/daxe/images/section_icons/more_information.png'); |
|
} |
|
section.role-objectives>h1:before { |
|
content:url('/adm/daxe/images/section_icons/objectives.png'); |
|
} |
|
section.role-prerequisites>h1:before { |
|
content:url('/adm/daxe/images/section_icons/prerequisites.png'); |
|
} |
|
section.role-remark>h1:before { |
|
content:url('/adm/daxe/images/section_icons/remark.png'); |
|
} |
|
section.role-reminder>h1:before { |
|
content:url('/adm/daxe/images/section_icons/reminder.png'); |
|
} |
|
section.role-summary>h1:before { |
|
content:url('/adm/daxe/images/section_icons/summary.png'); |
|
} |
|
section.role-syntax>h1:before { |
|
content:url('/adm/daxe/images/section_icons/syntax.png'); |
|
} |
|
section.role-warning>h1:before { |
|
content:url('/adm/daxe/images/section_icons/warning.png'); |
} |
} |
|
|
|
|
END |
END |
} |
} |
Line 7852 sub headtag {
|
Line 8179 sub headtag {
|
if (!$args->{'frameset'}) { |
if (!$args->{'frameset'}) { |
$result .= &Apache::lonhtmlcommon::htmlareaheaders(); |
$result .= &Apache::lonhtmlcommon::htmlareaheaders(); |
} |
} |
if ($args->{'force_register'}) { |
if ($args->{'force_register'} && $env{'request.noversionuri'} !~ m{^/res/adm/pages/}) { |
$result .= &Apache::lonmenu::registerurl(1); |
$result .= Apache::lonxml::display_title(); |
} |
} |
if (!$args->{'no_nav_bar'} |
if (!$args->{'no_nav_bar'} |
&& !$args->{'only_body'} |
&& !$args->{'only_body'} |
Line 7973 OFFLOAD
|
Line 8300 OFFLOAD
|
if (!$args->{'frameset'}) { |
if (!$args->{'frameset'}) { |
$result .= ' /'; |
$result .= ' /'; |
} |
} |
$result .= '>' |
$result .= '>' |
.$inhibitprint |
.$inhibitprint |
.$head_extra; |
.$head_extra; |
my $clientmobile; |
my $clientmobile; |
Line 7987 OFFLOAD
|
Line 8314 OFFLOAD
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0"> |
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0"> |
<meta name="apple-mobile-web-app-capable" content="yes" />'; |
<meta name="apple-mobile-web-app-capable" content="yes" />'; |
} |
} |
$result .= '<meta name="google" content="notranslate" />'."\n"; |
|
return $result.'</head>'; |
return $result.'</head>'; |
} |
} |
|
|
Line 8006 sub font_settings {
|
Line 8332 sub font_settings {
|
my $headerstring=''; |
my $headerstring=''; |
if ((!$env{'browser.mathml'} && $env{'browser.unicode'}) || |
if ((!$env{'browser.mathml'} && $env{'browser.unicode'}) || |
((ref($args) eq 'HASH') && ($args->{'browser.unicode'}))) { |
((ref($args) eq 'HASH') && ($args->{'browser.unicode'}))) { |
$headerstring.= |
$headerstring.= |
'<meta http-equiv="Content-Type" content="text/html; charset=utf-8"'; |
'<meta http-equiv="Content-Type" content="text/html; charset=utf-8"'; |
if (!$args->{'frameset'}) { |
if (!$args->{'frameset'}) { |
$headerstring.= ' /'; |
$headerstring.= ' /'; |
} |
} |
$headerstring .= '>'."\n"; |
$headerstring .= '>'."\n"; |
} |
} |
return $headerstring; |
return $headerstring; |
} |
} |
Line 8164 $args - additional optional args support
|
Line 8490 $args - additional optional args support
|
skip_phases -> hash ref of |
skip_phases -> hash ref of |
head -> skip the <html><head> generation |
head -> skip the <html><head> generation |
body -> skip all <body> generation |
body -> skip all <body> generation |
no_inline_link -> if true and in remote mode, don't show the |
|
'Switch To Inline Menu' link |
|
no_auto_mt_title -> prevent &mt()ing the title arg |
no_auto_mt_title -> prevent &mt()ing the title arg |
bread_crumbs -> Array containing breadcrumbs |
bread_crumbs -> Array containing breadcrumbs |
bread_crumbs_component -> if exists show it as headline else show only the breadcrumbs |
bread_crumbs_component -> if exists show it as headline else show only the breadcrumbs |
bread_crumbs_nomenu -> if true will pass false as the value of $menulink |
group -> includes the current group, if page is for a |
to lonhtmlcommon::breadcrumbs |
specific group |
group -> includes the current group, if page is for a |
|
specific group |
|
|
|
=back |
=back |
|
|
Line 8202 sub start_page {
|
Line 8524 sub start_page {
|
$args->{'function'}, $args->{'add_entries'}, |
$args->{'function'}, $args->{'add_entries'}, |
$args->{'only_body'}, $args->{'domain'}, |
$args->{'only_body'}, $args->{'domain'}, |
$args->{'force_register'}, $args->{'no_nav_bar'}, |
$args->{'force_register'}, $args->{'no_nav_bar'}, |
$args->{'bgcolor'}, $args->{'no_inline_link'}, |
$args->{'bgcolor'}, $args, |
$args, \@advtools); |
\@advtools); |
} |
} |
} |
} |
|
|
Line 8236 sub start_page {
|
Line 8558 sub start_page {
|
if (@advtools > 0) { |
if (@advtools > 0) { |
&Apache::lonmenu::advtools_crumbs(@advtools); |
&Apache::lonmenu::advtools_crumbs(@advtools); |
} |
} |
my $menulink; |
|
# if arg: bread_crumbs_nomenu is true pass 0 as $menulink item. |
|
if (exists($args->{'bread_crumbs_nomenu'})) { |
|
$menulink = 0; |
|
} else { |
|
undef($menulink); |
|
} |
|
#if bread_crumbs_component exists show it as headline else show only the breadcrumbs |
#if bread_crumbs_component exists show it as headline else show only the breadcrumbs |
if(exists($args->{'bread_crumbs_component'})){ |
if(exists($args->{'bread_crumbs_component'})){ |
$result .= &Apache::lonhtmlcommon::breadcrumbs($args->{'bread_crumbs_component'},'',$menulink); |
$result .= &Apache::lonhtmlcommon::breadcrumbs($args->{'bread_crumbs_component'}); |
}else{ |
} elsif ($args->{'crstype'} eq 'Placement') { |
$result .= &Apache::lonhtmlcommon::breadcrumbs('','',$menulink); |
$result .= &Apache::lonhtmlcommon::breadcrumbs('','','','','','','','','', |
|
$args->{'crstype'}); |
|
} else { |
|
$result .= &Apache::lonhtmlcommon::breadcrumbs(); |
} |
} |
} elsif (($env{'environment.remote'} eq 'on') && |
|
($env{'form.inhibitmenu'} ne 'yes') && |
|
($env{'request.noversionuri'} =~ m{^/res/}) && |
|
($env{'request.noversionuri'} !~ m{^/res/adm/pages/})) { |
|
$result .= '<div style="padding:0;margin:0;clear:both"><hr /></div>'; |
|
} |
} |
return $result; |
return $result; |
} |
} |
Line 8349 var modalWindow = {
|
Line 8663 var modalWindow = {
|
}; |
}; |
var openMyModal = function(source,width,height,scrolling,transparency,style) |
var openMyModal = function(source,width,height,scrolling,transparency,style) |
{ |
{ |
source = source.replace(/'/g,"'"); |
source = source.replace("'","'"); |
modalWindow.windowId = "myModal"; |
modalWindow.windowId = "myModal"; |
modalWindow.width = width; |
modalWindow.width = width; |
modalWindow.height = height; |
modalWindow.height = height; |
Line 8401 sub modal_adhoc_inner {
|
Line 8715 sub modal_adhoc_inner {
|
my ($funcname,$width,$height,$content)=@_; |
my ($funcname,$width,$height,$content)=@_; |
my $innerwidth=$width-20; |
my $innerwidth=$width-20; |
$content=&js_ready( |
$content=&js_ready( |
&start_page('Dialog',undef,{'only_body'=>1,'bgcolor'=>'#FFFFFF'}). |
&start_page('Dialog',undef,{'only_body'=>1,'bgcolor'=>'#FFFFFF'}). |
&start_scrollbox($width.'px',$innerwidth.'px',$height.'px','myModal','#FFFFFF',undef,1). |
&start_scrollbox($width.'px',$innerwidth.'px',$height.'px','myModal','#FFFFFF',undef,1). |
$content. |
$content. |
&end_scrollbox(). |
&end_scrollbox(). |
Line 9046 sub get_sections {
|
Line 9360 sub get_sections {
|
} |
} |
} |
} |
|
|
if ($check_students) { |
if ($check_students) { |
my ($classlist) = &Apache::loncoursedata::get_classlist($cdom,$cnum); |
my ($classlist) = &Apache::loncoursedata::get_classlist($cdom,$cnum); |
my $sec_index = &Apache::loncoursedata::CL_SECTION(); |
my $sec_index = &Apache::loncoursedata::CL_SECTION(); |
my $status_index = &Apache::loncoursedata::CL_STATUS(); |
my $status_index = &Apache::loncoursedata::CL_STATUS(); |
Line 9368 Incoming parameters:
|
Line 9682 Incoming parameters:
|
2. user's domain |
2. user's domain |
3. quota name - portfolio, author, or course |
3. quota name - portfolio, author, or course |
(if no quota name provided, defaults to portfolio). |
(if no quota name provided, defaults to portfolio). |
4. crstype - official, unofficial, textbook or community, if quota name is |
4. crstype - official, unofficial, textbook, placement or community, |
course |
if quota name is course |
|
|
Returns: |
Returns: |
1. Disk quota (in MB) assigned to student. |
1. Disk quota (in MB) assigned to student. |
Line 9442 sub get_user_quota {
|
Line 9756 sub get_user_quota {
|
if ($quota eq '' || wantarray) { |
if ($quota eq '' || wantarray) { |
if ($quotaname eq 'course') { |
if ($quotaname eq 'course') { |
my %domdefs = &Apache::lonnet::get_domain_defaults($udom); |
my %domdefs = &Apache::lonnet::get_domain_defaults($udom); |
if (($crstype eq 'official') || ($crstype eq 'unofficial') || |
if (($crstype eq 'official') || ($crstype eq 'unofficial') || |
($crstype eq 'community') || ($crstype eq 'textbook')) { |
($crstype eq 'community') || ($crstype eq 'textbook') || |
|
($crstype eq 'placement')) { |
$defquota = $domdefs{$crstype.'quota'}; |
$defquota = $domdefs{$crstype.'quota'}; |
} |
} |
if ($defquota eq '') { |
if ($defquota eq '') { |
Line 9591 Inputs: 7
|
Line 9906 Inputs: 7
|
4. filename of file for which action is being requested |
4. filename of file for which action is being requested |
5. filesize (kB) of file |
5. filesize (kB) of file |
6. action being taken: copy or upload. |
6. action being taken: copy or upload. |
7. quotatype (in course context -- official, unofficial, community or textbook). |
7. quotatype (in course context -- official, unofficial, textbook, placement or community). |
|
|
Returns: 1 scalar: HTML to display containing warning if quota would be exceeded, |
Returns: 1 scalar: HTML to display containing warning if quota would be exceeded, |
otherwise return null. |
otherwise return null. |
Line 9627 sub excess_filesize_warning {
|
Line 9942 sub excess_filesize_warning {
|
############################################### |
############################################### |
|
|
|
|
|
|
|
|
sub get_secgrprole_info { |
sub get_secgrprole_info { |
my ($cdom,$cnum,$needroles,$type) = @_; |
my ($cdom,$cnum,$needroles,$type) = @_; |
my %sections_count = &get_sections($cdom,$cnum); |
my %sections_count = &get_sections($cdom,$cnum); |
Line 9665 sub get_secgrprole_info {
|
Line 9982 sub get_secgrprole_info {
|
} |
} |
|
|
sub user_picker { |
sub user_picker { |
my ($dom,$srch,$forcenewuser,$caller,$cancreate,$usertype,$context,$fixeddom,$noinstd) = @_; |
my ($dom,$srch,$forcenewuser,$caller,$cancreate,$usertype,$context,$fixeddom) = @_; |
my $currdom = $dom; |
my $currdom = $dom; |
my @alldoms = &Apache::lonnet::all_domains(); |
my @alldoms = &Apache::lonnet::all_domains(); |
if (@alldoms == 1) { |
if (@alldoms == 1) { |
Line 9730 sub user_picker {
|
Line 10047 sub user_picker {
|
&html_escape(\%html_lt); |
&html_escape(\%html_lt); |
&js_escape(\%js_lt); |
&js_escape(\%js_lt); |
my $domform; |
my $domform; |
my $allow_blank = 1; |
|
if ($fixeddom) { |
if ($fixeddom) { |
$allow_blank = 0; |
$domform = &select_dom_form($currdom,'srchdomain',1,1,undef,[$currdom]); |
$domform = &select_dom_form($currdom,'srchdomain',$allow_blank,1,undef,[$currdom]); |
|
} else { |
} else { |
$domform = &select_dom_form($currdom,'srchdomain',$allow_blank,1); |
$domform = &select_dom_form($currdom,'srchdomain',1,1); |
} |
} |
my $srchinsel = ' <select name="srchin">'; |
my $srchinsel = ' <select name="srchin">'; |
|
|
Line 9748 sub user_picker {
|
Line 10063 sub user_picker {
|
next if ($option eq 'alc'); |
next if ($option eq 'alc'); |
next if (($option eq 'crs') && ($env{'form.form'} eq 'requestcrs')); |
next if (($option eq 'crs') && ($env{'form.form'} eq 'requestcrs')); |
next if ($option eq 'crs' && !$env{'request.course.id'}); |
next if ($option eq 'crs' && !$env{'request.course.id'}); |
next if (($option eq 'instd') && ($noinstd)); |
|
if ($curr_selected{'srchin'} eq $option) { |
if ($curr_selected{'srchin'} eq $option) { |
$srchinsel .= ' |
$srchinsel .= ' |
<option value="'.$option.'" selected="selected">'.$html_lt{$option}.'</option>'; |
<option value="'.$option.'" selected="selected">'.$html_lt{$option}.'</option>'; |
Line 9940 sub user_rule_check {
|
Line 10254 sub user_rule_check {
|
if (ref($usershash) eq 'HASH') { |
if (ref($usershash) eq 'HASH') { |
if (keys(%{$usershash}) > 1) { |
if (keys(%{$usershash}) > 1) { |
my (%by_username,%by_id,%userdoms); |
my (%by_username,%by_id,%userdoms); |
my $checkid; |
my $checkid; |
if (ref($checks) eq 'HASH') { |
if (ref($checks) eq 'HASH') { |
if ((!defined($checks->{'username'})) && (defined($checks->{'id'}))) { |
if ((!defined($checks->{'username'})) && (defined($checks->{'id'}))) { |
$checkid = 1; |
$checkid = 1; |
Line 9951 sub user_rule_check {
|
Line 10265 sub user_rule_check {
|
if ($checkid) { |
if ($checkid) { |
if (ref($usershash->{$user}) eq 'HASH') { |
if (ref($usershash->{$user}) eq 'HASH') { |
if ($usershash->{$user}->{'id'} ne '') { |
if ($usershash->{$user}->{'id'} ne '') { |
$by_id{$udom}{$usershash->{$user}->{'id'}} = $uname; |
$by_id{$udom}{$usershash->{$user}->{'id'}} = $uname; |
$userdoms{$udom} = 1; |
$userdoms{$udom} = 1; |
if (ref($inst_results) eq 'HASH') { |
if (ref($inst_results) eq 'HASH') { |
$inst_results->{$uname.':'.$udom} = {}; |
$inst_results->{$uname.':'.$udom} = {}; |
Line 10021 sub user_rule_check {
|
Line 10335 sub user_rule_check {
|
if (ref($usershash->{$user}) eq 'HASH') { |
if (ref($usershash->{$user}) eq 'HASH') { |
if (ref($checks) eq 'HASH') { |
if (ref($checks) eq 'HASH') { |
if (defined($checks->{'username'})) { |
if (defined($checks->{'username'})) { |
($inst_response{$user},%{$inst_results->{$user}}) = |
($inst_response{$user},%{$inst_results->{$user}}) = |
&Apache::lonnet::get_instuser($udom,$uname); |
&Apache::lonnet::get_instuser($udom,$uname); |
} elsif (defined($checks->{'id'})) { |
} elsif (defined($checks->{'id'})) { |
if ($usershash->{$user}->{'id'} ne '') { |
if ($usershash->{$user}->{'id'} ne '') { |
Line 10044 sub user_rule_check {
|
Line 10358 sub user_rule_check {
|
if (ref($domconfig{'usercreation'}) eq 'HASH') { |
if (ref($domconfig{'usercreation'}) eq 'HASH') { |
foreach my $item ('username','id') { |
foreach my $item ('username','id') { |
if (ref($domconfig{'usercreation'}{$item.'_rule'}) eq 'ARRAY') { |
if (ref($domconfig{'usercreation'}{$item.'_rule'}) eq 'ARRAY') { |
$$curr_rules{$udom}{$item} = |
$$curr_rules{$udom}{$item} = |
$domconfig{'usercreation'}{$item.'_rule'}; |
$domconfig{'usercreation'}{$item.'_rule'}; |
} |
} |
} |
} |
Line 10067 sub user_rule_check {
|
Line 10381 sub user_rule_check {
|
$id = $inst_results->{$user}->{'id'}; |
$id = $inst_results->{$user}->{'id'}; |
} |
} |
} |
} |
if ($id eq '') { |
if ($id eq '') { |
if (ref($usershash->{$user})) { |
if (ref($usershash->{$user})) { |
$id = $usershash->{$user}->{'id'}; |
$id = $usershash->{$user}->{'id'}; |
} |
} |
Line 10246 sub get_institutional_codes {
|
Line 10560 sub get_institutional_codes {
|
foreach (@currxlists) { |
foreach (@currxlists) { |
if (m/^([^:]+):(\w*)$/) { |
if (m/^([^:]+):(\w*)$/) { |
unless (grep/^$1$/,@{$allcourses}) { |
unless (grep/^$1$/,@{$allcourses}) { |
push(@{$allcourses},$1); |
push @{$allcourses},$1; |
$$LC_code{$1} = $2; |
$$LC_code{$1} = $2; |
} |
} |
} |
} |
Line 10259 sub get_institutional_codes {
|
Line 10573 sub get_institutional_codes {
|
my $sec = $coursecode.$1; |
my $sec = $coursecode.$1; |
my $lc_sec = $2; |
my $lc_sec = $2; |
unless (grep/^$sec$/,@{$allcourses}) { |
unless (grep/^$sec$/,@{$allcourses}) { |
push(@{$allcourses},$sec); |
push @{$allcourses},$sec; |
$$LC_code{$sec} = $lc_sec; |
$$LC_code{$sec} = $lc_sec; |
} |
} |
} |
} |
Line 10369 future_reservable - ref to hash of stude
|
Line 10683 future_reservable - ref to hash of stude
|
|
|
Keys in inner hash are: |
Keys in inner hash are: |
(a) symb: either blank or symb to which slot use is restricted. |
(a) symb: either blank or symb to which slot use is restricted. |
(b) startreserve: start date of reservation period. |
(b) startreserve: start date of reservation period. |
(c) uniqueperiod: start,end dates when slot is to be uniquely |
(c) uniqueperiod: start,end dates when slot is to be uniquely |
selected. |
selected. |
|
|
Line 10379 future_reservable - ref to hash of stude
|
Line 10693 future_reservable - ref to hash of stude
|
|
|
sub get_future_slots { |
sub get_future_slots { |
my ($cnum,$cdom,$now,$symb) = @_; |
my ($cnum,$cdom,$now,$symb) = @_; |
|
my $map; |
|
if ($symb) { |
|
($map) = &Apache::lonnet::decode_symb($symb); |
|
} |
my (%reservable_now,%future_reservable,@sorted_reservable,@sorted_future); |
my (%reservable_now,%future_reservable,@sorted_reservable,@sorted_future); |
my %slots = &Apache::lonnet::get_course_slots($cnum,$cdom); |
my %slots = &Apache::lonnet::get_course_slots($cnum,$cdom); |
foreach my $slot (keys(%slots)) { |
foreach my $slot (keys(%slots)) { |
next unless($slots{$slot}->{'type'} eq 'schedulable_student'); |
next unless($slots{$slot}->{'type'} eq 'schedulable_student'); |
if ($symb) { |
if ($symb) { |
next if (($slots{$slot}->{'symb'} ne '') && |
if ($slots{$slot}->{'symb'} ne '') { |
($slots{$slot}->{'symb'} ne $symb)); |
my $canuse; |
|
my %oksymbs; |
|
my @slotsymbs = split(/\s*,\s*/,$slots{$slot}->{'symb'}); |
|
map { $oksymbs{$_} = 1; } @slotsymbs; |
|
if ($oksymbs{$symb}) { |
|
$canuse = 1; |
|
} else { |
|
foreach my $item (@slotsymbs) { |
|
if ($item =~ /\.(page|sequence)$/) { |
|
(undef,undef,my $sloturl) = &Apache::lonnet::decode_symb($item); |
|
if (($map ne '') && ($map eq $sloturl)) { |
|
$canuse = 1; |
|
last; |
|
} |
|
} |
|
} |
|
} |
|
next unless ($canuse); |
|
} |
} |
} |
if (($slots{$slot}->{'starttime'} > $now) && |
if (($slots{$slot}->{'starttime'} > $now) && |
($slots{$slot}->{'endtime'} > $now)) { |
($slots{$slot}->{'endtime'} > $now)) { |
Line 10438 sub get_future_slots {
|
Line 10774 sub get_future_slots {
|
$reservable_now{$slot} = { |
$reservable_now{$slot} = { |
symb => $symb, |
symb => $symb, |
endreserve => $lastres, |
endreserve => $lastres, |
uniqueperiod => $uniqueperiod, |
uniqueperiod => $uniqueperiod, |
}; |
}; |
} elsif (($startreserve > $now) && |
} elsif (($startreserve > $now) && |
(!$endreserve || $endreserve > $startreserve)) { |
(!$endreserve || $endreserve > $startreserve)) { |
Line 10603 sub get_env_multiple {
|
Line 10939 sub get_env_multiple {
|
return(@values); |
return(@values); |
} |
} |
|
|
|
# Looks at given dependencies, and returns something depending on the context. |
|
# For coursedocs paste, returns (undef, $counter, $numpathchg, \%existing). |
|
# For syllabus rewrites, returns (undef, $counter, $numpathchg, \%existing, \%mapping). |
|
# For all other contexts, returns ($output, $counter, $numpathchg). |
|
# $output: string with the HTML output. Can contain missing dependencies with an upload form, existing dependencies, and dependencies no longer in use. |
|
# $counter: integer with the number of existing dependencies when no HTML output is returned, and the number of missing dependencies when an HTML output is returned. |
|
# $numpathchg: integer with the number of cleaned up dependency paths. |
|
# \%existing: hash reference clean path -> 1 only for existing dependencies. |
|
# \%mapping: hash reference clean path -> original path for all dependencies. |
|
# @param {string} actionurl - The path to the handler, indicative of the context. |
|
# @param {string} state - Can contain HTML with hidden inputs that will be added to the output form. |
|
# @param {hash reference} allfiles - List of file info from lonnet::extract_embedded_items |
|
# @param {hash reference} codebase - undef, not modified by lonnet::extract_embedded_items ? |
|
# @param {hash reference} args - More parameters ! Possible keys: error_on_invalid_names (boolean), ignore_remote_references (boolean), current_path (string), docs_url (string), docs_title (string), context (string) |
|
# @return {Array} - array depending on the context (not a reference) |
sub ask_for_embedded_content { |
sub ask_for_embedded_content { |
|
# NOTE: documentation was added afterwards, it could be wrong |
my ($actionurl,$state,$allfiles,$codebase,$args)=@_; |
my ($actionurl,$state,$allfiles,$codebase,$args)=@_; |
my (%subdependencies,%dependencies,%mapping,%existing,%newfiles,%pathchanges, |
my (%subdependencies,%dependencies,%mapping,%existing,%newfiles,%pathchanges, |
%currsubfile,%unused,$rem); |
%currsubfile,%unused,$rem); |
Line 10619 sub ask_for_embedded_content {
|
Line 10971 sub ask_for_embedded_content {
|
my $heading = &mt('Upload embedded files'); |
my $heading = &mt('Upload embedded files'); |
my $buttontext = &mt('Upload'); |
my $buttontext = &mt('Upload'); |
|
|
|
# fills these variables based on the context: |
|
# $navmap, $cdom, $cnum, $udom, $uname, $url, $toplevel, $getpropath, |
|
# $path, $fileloc, $title, $rem, $filename |
if ($env{'request.course.id'}) { |
if ($env{'request.course.id'}) { |
if ($actionurl eq '/adm/dependencies') { |
if ($actionurl eq '/adm/dependencies') { |
$navmap = Apache::lonnavmaps::navmap->new(); |
$navmap = Apache::lonnavmaps::navmap->new(); |
Line 10626 sub ask_for_embedded_content {
|
Line 10981 sub ask_for_embedded_content {
|
$cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
$cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
$cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
$cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
} |
} |
if (($actionurl eq '/adm/portfolio') || |
if (($actionurl eq '/adm/portfolio') || |
($actionurl eq '/adm/coursegrp_portfolio')) { |
($actionurl eq '/adm/coursegrp_portfolio')) { |
my $current_path='/'; |
my $current_path='/'; |
if ($env{'form.currentpath'}) { |
if ($env{'form.currentpath'}) { |
Line 10658 sub ask_for_embedded_content {
|
Line 11013 sub ask_for_embedded_content {
|
$toplevel = $url; |
$toplevel = $url; |
if ($args->{'context'} eq 'paste') { |
if ($args->{'context'} eq 'paste') { |
($cdom,$cnum) = ($url =~ m{^\Q/uploaded/\E($match_domain)/($match_courseid)/}); |
($cdom,$cnum) = ($url =~ m{^\Q/uploaded/\E($match_domain)/($match_courseid)/}); |
($path) = |
($path) = |
($toplevel =~ m{^(\Q/uploaded/$cdom/$cnum/\E(?:docs|supplemental)/(?:default|\d+)/\d+)/}); |
($toplevel =~ m{^(\Q/uploaded/$cdom/$cnum/\E(?:docs|supplemental)/(?:default|\d+)/\d+)/}); |
$fileloc = &Apache::lonnet::filelocation('',$toplevel); |
$fileloc = &Apache::lonnet::filelocation('',$toplevel); |
$fileloc =~ s{^/}{}; |
$fileloc =~ s{^/}{}; |
} |
} |
} |
} |
} elsif ($actionurl eq '/adm/dependencies') { |
} elsif ($actionurl eq '/adm/dependencies') { |
if ($env{'request.course.id'} ne '') { |
if ($env{'request.course.id'} ne '') { |
if (ref($args) eq 'HASH') { |
if (ref($args) eq 'HASH') { |
$url = $args->{'docs_url'}; |
$url = $args->{'docs_url'}; |
$title = $args->{'docs_title'}; |
$title = $args->{'docs_title'}; |
$toplevel = $url; |
$toplevel = $url; |
unless ($toplevel =~ m{^/}) { |
unless ($toplevel =~ m{^/}) { |
$toplevel = "/$url"; |
$toplevel = "/$url"; |
} |
} |
Line 10703 sub ask_for_embedded_content {
|
Line 11058 sub ask_for_embedded_content {
|
$fileloc = &Apache::lonnet::filelocation('',$toplevel).'/'; |
$fileloc = &Apache::lonnet::filelocation('',$toplevel).'/'; |
$fileloc =~ s{^/}{}; |
$fileloc =~ s{^/}{}; |
} |
} |
|
|
|
# parses the dependency paths to get some info |
|
# fills $newfiles, $mapping, $subdependencies, $dependencies |
|
# $newfiles: hash URL -> 1 for new files or external URLs |
|
# (will be completed later) |
|
# $mapping: |
|
# for external URLs: external URL -> external URL |
|
# for relative paths: clean path -> original path |
|
# $subdependencies: hash clean path -> clean file name -> 1 for relative paths in subdirectories |
|
# $dependencies: hash clean or not file name -> 1 for relative paths not in subdirectories |
foreach my $file (keys(%{$allfiles})) { |
foreach my $file (keys(%{$allfiles})) { |
my $embed_file; |
my $embed_file; |
if (($path eq "/uploaded/$cdom/$cnum/portfolio/syllabus") && ($file =~ m{^\Q$path/\E(.+)$})) { |
if (($path eq "/uploaded/$cdom/$cnum/portfolio/syllabus") && ($file =~ m{^\Q$path/\E(.+)$})) { |
Line 10745 sub ask_for_embedded_content {
|
Line 11110 sub ask_for_embedded_content {
|
} |
} |
} |
} |
} |
} |
|
|
|
# looks for all existing files in dependency subdirectories (from $subdependencies filled above) |
|
# and lists |
|
# fills $currsubfile, $pathchanges, $existing, $numexisting, $newfiles, $unused |
|
# $currsubfile: hash clean path -> file name -> 1 for all existing files in the path |
|
# $pathchanges: hash clean path -> 1 if the file in subdirectory exists and |
|
# the path had to be cleaned up |
|
# $existing: hash clean path -> 1 if the file exists |
|
# $numexisting: number of keys in $existing |
|
# $newfiles: updated with clean path -> 1 for files in subdirectories that do not exist |
|
# $unused: only for /adm/dependencies, hash clean path -> 1 for existing files in |
|
# dependency subdirectories that are |
|
# not listed as dependencies, with some exceptions using $rem |
my $dirptr = 16384; |
my $dirptr = 16384; |
foreach my $path (keys(%subdependencies)) { |
foreach my $path (keys(%subdependencies)) { |
$currsubfile{$path} = {}; |
$currsubfile{$path} = {}; |
if (($actionurl eq '/adm/portfolio') || |
if (($actionurl eq '/adm/portfolio') || |
($actionurl eq '/adm/coursegrp_portfolio')) { |
($actionurl eq '/adm/coursegrp_portfolio')) { |
my ($sublistref,$listerror) = |
my ($sublistref,$listerror) = |
&Apache::lonnet::dirlist($url.$path,$udom,$uname,$getpropath); |
&Apache::lonnet::dirlist($url.$path,$udom,$uname,$getpropath); |
if (ref($sublistref) eq 'ARRAY') { |
if (ref($sublistref) eq 'ARRAY') { |
Line 10820 sub ask_for_embedded_content {
|
Line 11198 sub ask_for_embedded_content {
|
} |
} |
} |
} |
} |
} |
|
|
|
# fills $currfile, hash file name -> 1 or [$size,$mtime] |
|
# for files in $url or $fileloc (target directory) in some contexts |
my %currfile; |
my %currfile; |
if (($actionurl eq '/adm/portfolio') || |
if (($actionurl eq '/adm/portfolio') || |
($actionurl eq '/adm/coursegrp_portfolio')) { |
($actionurl eq '/adm/coursegrp_portfolio')) { |
Line 10858 sub ask_for_embedded_content {
|
Line 11239 sub ask_for_embedded_content {
|
} |
} |
} |
} |
} |
} |
|
# updates $pathchanges, $existing, $numexisting, $newfiles and $unused for files that |
|
# are not in subdirectories, using $currfile |
foreach my $file (keys(%dependencies)) { |
foreach my $file (keys(%dependencies)) { |
if (exists($currfile{$file})) { |
if (exists($currfile{$file})) { |
unless ($mapping{$file} eq $file) { |
unless ($mapping{$file} eq $file) { |
Line 10886 sub ask_for_embedded_content {
|
Line 11269 sub ask_for_embedded_content {
|
$unused{$file} = 1; |
$unused{$file} = 1; |
} |
} |
} |
} |
|
|
|
# returns some results for coursedocs paste and syllabus rewrites ($output is undef) |
if (($actionurl eq '/adm/coursedocs') && (ref($args) eq 'HASH') && |
if (($actionurl eq '/adm/coursedocs') && (ref($args) eq 'HASH') && |
($args->{'context'} eq 'paste')) { |
($args->{'context'} eq 'paste')) { |
$counter = scalar(keys(%existing)); |
$counter = scalar(keys(%existing)); |
$numpathchg = scalar(keys(%pathchanges)); |
$numpathchg = scalar(keys(%pathchanges)); |
return ($output,$counter,$numpathchg,\%existing); |
return ($output,$counter,$numpathchg,\%existing); |
} elsif (($actionurl eq "/public/$cdom/$cnum/syllabus") && |
} elsif (($actionurl eq "/public/$cdom/$cnum/syllabus") && |
(ref($args) eq 'HASH') && ($args->{'context'} eq 'rewrites')) { |
(ref($args) eq 'HASH') && ($args->{'context'} eq 'rewrites')) { |
$counter = scalar(keys(%existing)); |
$counter = scalar(keys(%existing)); |
$numpathchg = scalar(keys(%pathchanges)); |
$numpathchg = scalar(keys(%pathchanges)); |
return ($output,$counter,$numpathchg,\%existing,\%mapping); |
return ($output,$counter,$numpathchg,\%existing,\%mapping); |
} |
} |
|
|
|
# returns HTML otherwise, with dependency results and to ask for more uploads |
|
|
|
# $upload_output: missing dependencies (with upload form) |
|
# $modify_output: uploaded dependencies (in use) |
|
# $delete_output: files no longer in use (unused files are not listed for londocs, bug?) |
foreach my $embed_file (sort {lc($a) cmp lc($b)} keys(%newfiles)) { |
foreach my $embed_file (sort {lc($a) cmp lc($b)} keys(%newfiles)) { |
if ($actionurl eq '/adm/dependencies') { |
if ($actionurl eq '/adm/dependencies') { |
next if ($embed_file =~ m{^\w+://}); |
next if ($embed_file =~ m{^\w+://}); |
Line 11120 sub ask_for_embedded_content {
|
Line 11511 sub ask_for_embedded_content {
|
|
|
Performs clean-up of directories, subdirectories and filename in an |
Performs clean-up of directories, subdirectories and filename in an |
embedded object, referenced in an HTML file which is being uploaded |
embedded object, referenced in an HTML file which is being uploaded |
to a course or portfolio, where |
to a course or portfolio, where |
"Upload embedded images/multimedia files if HTML file" checkbox was |
"Upload embedded images/multimedia files if HTML file" checkbox was |
checked. |
checked. |
|
|
Line 11139 sub clean_path {
|
Line 11530 sub clean_path {
|
@contents = ($embed_file); |
@contents = ($embed_file); |
} |
} |
my $lastidx = scalar(@contents)-1; |
my $lastidx = scalar(@contents)-1; |
for (my $i=0; $i<=$lastidx; $i++) { |
for (my $i=0; $i<=$lastidx; $i++) { |
$contents[$i]=~s{\\}{/}g; |
$contents[$i]=~s{\\}{/}g; |
$contents[$i]=~s/\s+/\_/g; |
$contents[$i]=~s/\s+/\_/g; |
$contents[$i]=~s{[^/\w\.\-]}{}g; |
$contents[$i]=~s{[^/\w\.\-]}{}g; |
Line 11478 sub modify_html_refs {
|
Line 11869 sub modify_html_refs {
|
} |
} |
my (%allfiles,%codebase,$output,$content); |
my (%allfiles,%codebase,$output,$content); |
my @changes = &get_env_multiple('form.namechange'); |
my @changes = &get_env_multiple('form.namechange'); |
unless ((@changes > 0) || ($context eq 'syllabus')) { |
unless ((@changes > 0) || ($context eq 'syllabus')) { |
if (wantarray) { |
if (wantarray) { |
return ('',0,0); |
return ('',0,0); |
} else { |
} else { |
Line 11510 sub modify_html_refs {
|
Line 11901 sub modify_html_refs {
|
return; |
return; |
} |
} |
} |
} |
if (open(my $fh,'<',$container)) { |
if (open(my $fh,"<$container")) { |
$content = join('', <$fh>); |
$content = join('', <$fh>); |
close($fh); |
close($fh); |
} else { |
} else { |
Line 11575 sub modify_html_refs {
|
Line 11966 sub modify_html_refs {
|
} |
} |
} |
} |
} else { |
} else { |
if (open(my $fh,'>',$container)) { |
if (open(my $fh,">$container")) { |
print $fh $content; |
print $fh $content; |
close($fh); |
close($fh); |
$output = '<p>'.&mt('Updated [quant,_1,reference] in [_2].', |
$output = '<p>'.&mt('Updated [quant,_1,reference] in [_2].', |
Line 11613 sub modify_html_refs {
|
Line 12004 sub modify_html_refs {
|
} |
} |
} |
} |
if ($rewrites) { |
if ($rewrites) { |
my $saveresult; |
my $saveresult; |
my $url = &Apache::lonnet::store_edited_file($container,$content,$udom,$uname,\$saveresult); |
my $url = &Apache::lonnet::store_edited_file($container,$content,$udom,$uname,\$saveresult); |
if ($url eq $container) { |
if ($url eq $container) { |
my ($fname) = ($container =~ m{/([^/]+)$}); |
my ($fname) = ($container =~ m{/([^/]+)$}); |
Line 12092 sub decompress_uploaded_file {
|
Line 12483 sub decompress_uploaded_file {
|
|
|
sub process_decompression { |
sub process_decompression { |
my ($docudom,$docuname,$file,$destination,$dir_root,$hiddenelem) = @_; |
my ($docudom,$docuname,$file,$destination,$dir_root,$hiddenelem) = @_; |
unless (($dir_root eq '/userfiles') && ($destination =~ m{^(docs|supplemental)/(default|\d+)/\d+$})) { |
|
return '<p class="LC_error">'.&mt('Not extracted.').'<br />'. |
|
&mt('Unexpected file path.').'</p>'."\n"; |
|
} |
|
unless (($docudom =~ /^$match_domain$/) && ($docuname =~ /^$match_courseid$/)) { |
|
return '<p class="LC_error">'.&mt('Not extracted.').'<br />'. |
|
&mt('Unexpected course context.').'</p>'."\n"; |
|
} |
|
unless ($file eq &Apache::lonnet::clean_filename($file)) { |
|
return '<p class="LC_error">'.&mt('Not extracted.').'<br />'. |
|
&mt('Filename contained unexpected characters.').'</p>'."\n"; |
|
} |
|
my ($dir,$error,$warning,$output); |
my ($dir,$error,$warning,$output); |
if ($file !~ /\.(zip|tar|bz2|gz|tar.gz|tar.bz2|tgz)$/i) { |
if ($file !~ /\.(zip|tar|bz2|gz|tar.gz|tar.bz2|tgz)$/i) { |
$error = &mt('Filename not a supported archive file type.'). |
$error = &mt('Filename not a supported archive file type.'). |
Line 12138 sub process_decompression {
|
Line 12517 sub process_decompression {
|
} |
} |
} |
} |
my $numskip = scalar(@to_skip); |
my $numskip = scalar(@to_skip); |
my $numoverwrite = scalar(@to_overwrite); |
if (($numskip > 0) && |
if (($numskip) && (!$numoverwrite)) { |
($numskip == $env{'form.archive_itemcount'})) { |
$warning = &mt('All items in the archive file already exist, and no overwriting of existing files has been requested.'); |
$warning = &mt('All items in the archive file already exist, and no overwriting of existing files has been requested.'); |
} elsif ($dir eq '') { |
} elsif ($dir eq '') { |
$error = &mt('Directory containing archive file unavailable.'); |
$error = &mt('Directory containing archive file unavailable.'); |
} elsif (!$error) { |
} elsif (!$error) { |
my ($decompressed,$display); |
my ($decompressed,$display); |
if (($numskip) || ($numoverwrite)) { |
if ($numskip > 0) { |
my $tempdir = time.'_'.$$.int(rand(10000)); |
my $tempdir = time.'_'.$$.int(rand(10000)); |
mkdir("$dir/$tempdir",0755); |
mkdir("$dir/$tempdir",0755); |
if (&File::Copy::move("$dir/$file","$dir/$tempdir/$file")) { |
system("mv $dir/$file $dir/$tempdir/$file"); |
($decompressed,$display) = |
($decompressed,$display) = |
&decompress_uploaded_file($file,"$dir/$tempdir"); |
&decompress_uploaded_file($file,"$dir/$tempdir"); |
foreach my $item (@to_skip) { |
foreach my $item (@to_skip) { |
if (($item ne '') && ($item !~ /\.\./)) { |
if (($item ne '') && ($item !~ /\.\./)) { |
if (-f "$dir/$tempdir/$item") { |
if (-f "$dir/$tempdir/$item") { |
unlink("$dir/$tempdir/$item"); |
unlink("$dir/$tempdir/$item"); |
} elsif (-d "$dir/$tempdir/$item") { |
} elsif (-d "$dir/$tempdir/$item") { |
&File::Path::remove_tree("$dir/$tempdir/$item",{ safe => 1 }); |
system("rm -rf $dir/$tempdir/$item"); |
} |
|
} |
|
} |
|
foreach my $item (@to_overwrite) { |
|
if ((-e "$dir/$tempdir/$item") && (-e "$dir/$item")) { |
|
if (($item ne '') && ($item !~ /\.\./)) { |
|
if (-f "$dir/$item") { |
|
unlink("$dir/$item"); |
|
} elsif (-d "$dir/$item") { |
|
&File::Path::remove_tree("$dir/$item",{ safe => 1 }); |
|
} |
|
&File::Copy::move("$dir/$tempdir/$item","$dir/$item"); |
|
} |
|
} |
} |
} |
} |
if (&File::Copy::move("$dir/$tempdir/$file","$dir/$file")) { |
|
&File::Path::remove_tree("$dir/$tempdir",{ safe => 1 }); |
|
} |
|
} |
} |
|
system("mv $dir/$tempdir/* $dir"); |
|
rmdir("$dir/$tempdir"); |
} else { |
} else { |
($decompressed,$display) = |
($decompressed,$display) = |
&decompress_uploaded_file($file,$dir); |
&decompress_uploaded_file($file,$dir); |
Line 12249 sub process_decompression {
|
Line 12614 sub process_decompression {
|
$env{'form.archive_title_'.$i} = $env{'form.camtasia_foldername'}; |
$env{'form.archive_title_'.$i} = $env{'form.camtasia_foldername'}; |
$displayed{'folder'} = $i; |
$displayed{'folder'} = $i; |
} elsif ((($item eq "$contents[0]/index.html") && ($version == 6)) || |
} elsif ((($item eq "$contents[0]/index.html") && ($version == 6)) || |
(($item eq "$contents[0]/$contents[0]".'.html') && ($version == 8))) { |
(($item eq "$contents[0]/$contents[0]".'.html') && ($version == 8))) { |
$env{'form.archive_'.$i} = 'display'; |
$env{'form.archive_'.$i} = 'display'; |
$env{'form.archive_title_'.$i} = $env{'form.camtasia_moviename'}; |
$env{'form.archive_title_'.$i} = $env{'form.camtasia_moviename'}; |
$displayed{'web'} = $i; |
$displayed{'web'} = $i; |
Line 12679 END
|
Line 13044 END
|
sub process_extracted_files { |
sub process_extracted_files { |
my ($context,$docudom,$docuname,$destination,$dir_root,$hiddenelem) = @_; |
my ($context,$docudom,$docuname,$destination,$dir_root,$hiddenelem) = @_; |
my $numitems = $env{'form.archive_count'}; |
my $numitems = $env{'form.archive_count'}; |
return if ((!$numitems) || ($numitems =~ /\D/)); |
return unless ($numitems); |
my @ids=&Apache::lonnet::current_machine_ids(); |
my @ids=&Apache::lonnet::current_machine_ids(); |
my ($prefix,$pathtocheck,$dir,$ishome,$error,$warning,%toplevelitems,%is_dir, |
my ($prefix,$pathtocheck,$dir,$ishome,$error,$warning,%toplevelitems,%is_dir, |
%folders,%containers,%mapinner,%prompttofetch); |
%folders,%containers,%mapinner,%prompttofetch); |
Line 12692 sub process_extracted_files {
|
Line 13057 sub process_extracted_files {
|
} else { |
} else { |
$prefix = $Apache::lonnet::perlvar{'lonDocRoot'}; |
$prefix = $Apache::lonnet::perlvar{'lonDocRoot'}; |
$pathtocheck = "$dir_root/$docudom/$docuname/$destination"; |
$pathtocheck = "$dir_root/$docudom/$docuname/$destination"; |
$dir = "$dir_root/$docudom/$docuname"; |
$dir = "$dir_root/$docudom/$docuname"; |
} |
} |
my $currdir = "$dir_root/$destination"; |
my $currdir = "$dir_root/$destination"; |
(my $docstype,$mapinner{'0'}) = ($destination =~ m{^(docs|supplemental)/(\w+)/}); |
(my $docstype,$mapinner{'0'}) = ($destination =~ m{^(docs|supplemental)/(\w+)/}); |
Line 12701 sub process_extracted_files {
|
Line 13066 sub process_extracted_files {
|
$folders{'0'} = $items[-2]; |
$folders{'0'} = $items[-2]; |
if ($env{'form.folderpath'} =~ /\:1$/) { |
if ($env{'form.folderpath'} =~ /\:1$/) { |
$containers{'0'}='page'; |
$containers{'0'}='page'; |
} else { |
} else { |
$containers{'0'}='sequence'; |
$containers{'0'}='sequence'; |
} |
} |
} |
} |
Line 12781 sub process_extracted_files {
|
Line 13146 sub process_extracted_files {
|
'.'.$containers{$outer},1,1); |
'.'.$containers{$outer},1,1); |
$newseqid{$i} = $newidx; |
$newseqid{$i} = $newidx; |
unless ($errtext) { |
unless ($errtext) { |
$result .= '<li>'.&mt('Folder: [_1] added to course', |
$result .= '<li>'.&mt('Folder: [_1] added to course',$docstitle).'</li>'."\n"; |
&HTML::Entities::encode($docstitle,'<>&"')). |
|
'</li>'."\n"; |
|
} |
} |
} |
} |
} else { |
} else { |
Line 12792 sub process_extracted_files {
|
Line 13155 sub process_extracted_files {
|
my $url = '/uploaded/'.$docudom.'/'.$docuname.'/'. |
my $url = '/uploaded/'.$docudom.'/'.$docuname.'/'. |
$docstype.'/'.$mapinner{$outer}.'/'.$newidx.'/'. |
$docstype.'/'.$mapinner{$outer}.'/'.$newidx.'/'. |
$title; |
$title; |
if (($outer !~ /\D/) && ($mapinner{$outer} !~ /\D/) && ($newidx !~ /\D/)) { |
if (!-e "$prefix$dir/$docstype/$mapinner{$outer}") { |
if (!-e "$prefix$dir/$docstype/$mapinner{$outer}") { |
mkdir("$prefix$dir/$docstype/$mapinner{$outer}",0755); |
mkdir("$prefix$dir/$docstype/$mapinner{$outer}",0755); |
} |
} |
if (!-e "$prefix$dir/$docstype/$mapinner{$outer}/$newidx") { |
if (!-e "$prefix$dir/$docstype/$mapinner{$outer}/$newidx") { |
mkdir("$prefix$dir/$docstype/$mapinner{$outer}/$newidx"); |
mkdir("$prefix$dir/$docstype/$mapinner{$outer}/$newidx"); |
} |
} |
if (-e "$prefix$dir/$docstype/$mapinner{$outer}/$newidx") { |
if (-e "$prefix$dir/$docstype/$mapinner{$outer}/$newidx") { |
system("mv $prefix$path $prefix$dir/$docstype/$mapinner{$outer}/$newidx/$title"); |
if (rename("$prefix$path","$prefix$dir/$docstype/$mapinner{$outer}/$newidx/$title")) { |
$newdest{$i} = "$prefix$dir/$docstype/$mapinner{$outer}/$newidx"; |
$newdest{$i} = "$prefix$dir/$docstype/$mapinner{$outer}/$newidx"; |
unless ($ishome) { |
unless ($ishome) { |
my $fetch = "$newdest{$i}/$title"; |
my $fetch = "$newdest{$i}/$title"; |
$fetch =~ s/^\Q$prefix$dir\E//; |
$fetch =~ s/^\Q$prefix$dir\E//; |
$prompttofetch{$fetch} = 1; |
$prompttofetch{$fetch} = 1; |
|
} |
|
} |
|
} |
} |
$LONCAPA::map::resources[$newidx]= |
} |
$docstitle.':'.$url.':false:normal:res'; |
$LONCAPA::map::resources[$newidx]= |
push(@LONCAPA::map::order, $newidx); |
$docstitle.':'.$url.':false:normal:res'; |
my ($outtext,$errtext)= |
push(@LONCAPA::map::order, $newidx); |
&LONCAPA::map::storemap('/uploaded/'.$docudom.'/'. |
my ($outtext,$errtext)= |
$docuname.'/'.$folders{$outer}. |
&LONCAPA::map::storemap('/uploaded/'.$docudom.'/'. |
'.'.$containers{$outer},1,1); |
$docuname.'/'.$folders{$outer}. |
unless ($errtext) { |
'.'.$containers{$outer},1,1); |
if (-e "$prefix$dir/$docstype/$mapinner{$outer}/$newidx/$title") { |
unless ($errtext) { |
$result .= '<li>'.&mt('File: [_1] added to course', |
if (-e "$prefix$dir/$docstype/$mapinner{$outer}/$newidx/$title") { |
&HTML::Entities::encode($docstitle,'<>&"')). |
$result .= '<li>'.&mt('File: [_1] added to course',$docstitle).'</li>'."\n"; |
'</li>'."\n"; |
|
} |
|
} |
} |
} else { |
|
$warning .= &mt('Item extracted from archive: [_1] has unexpected path.', |
|
&HTML::Entities::encode($path,'<>&"')).'<br />'; |
|
} |
} |
} |
} |
} |
} |
} |
} |
} else { |
} else { |
$warning .= &mt('Item extracted from archive: [_1] has unexpected path.', |
$warning .= &mt('Item extracted from archive: [_1] has unexpected path.',$path).'<br />'; |
&HTML::Entities::encode($path,'<>&"')).'<br />'; |
|
} |
} |
} |
} |
for (my $i=1; $i<=$numitems; $i++) { |
for (my $i=1; $i<=$numitems; $i++) { |
Line 12854 sub process_extracted_files {
|
Line 13208 sub process_extracted_files {
|
} |
} |
if ($itemidx eq '') { |
if ($itemidx eq '') { |
$itemidx = 0; |
$itemidx = 0; |
} |
} |
if (grep(/^\Q$referrer{$i}\E$/,@archdirs)) { |
if (grep(/^\Q$referrer{$i}\E$/,@archdirs)) { |
if ($mapinner{$referrer{$i}}) { |
if ($mapinner{$referrer{$i}}) { |
$fullpath = "$prefix$dir/$docstype/$mapinner{$referrer{$i}}"; |
$fullpath = "$prefix$dir/$docstype/$mapinner{$referrer{$i}}"; |
Line 12893 sub process_extracted_files {
|
Line 13247 sub process_extracted_files {
|
} |
} |
if ($fullpath ne '') { |
if ($fullpath ne '') { |
if (-e "$prefix$path") { |
if (-e "$prefix$path") { |
unless (rename("$prefix$path","$fullpath/$title")) { |
system("mv $prefix$path $fullpath/$title"); |
$warning .= &mt('Failed to rename dependency').'<br />'; |
|
} |
|
} |
} |
if (-e "$fullpath/$title") { |
if (-e "$fullpath/$title") { |
my $showpath; |
my $showpath; |
Line 12903 sub process_extracted_files {
|
Line 13255 sub process_extracted_files {
|
$showpath = "$relpath/$title"; |
$showpath = "$relpath/$title"; |
} else { |
} else { |
$showpath = "/$title"; |
$showpath = "/$title"; |
} |
} |
$result .= '<li>'.&mt('[_1] included as a dependency', |
$result .= '<li>'.&mt('[_1] included as a dependency',$showpath).'</li>'."\n"; |
&HTML::Entities::encode($showpath,'<>&"')). |
} |
'</li>'."\n"; |
|
} |
|
unless ($ishome) { |
unless ($ishome) { |
my $fetch = "$fullpath/$title"; |
my $fetch = "$fullpath/$title"; |
$fetch =~ s/^\Q$prefix$dir\E//; |
$fetch =~ s/^\Q$prefix$dir\E//; |
$prompttofetch{$fetch} = 1; |
$prompttofetch{$fetch} = 1; |
} |
} |
} |
} |
} |
} |
} elsif ($env{'form.archive_'.$referrer{$i}} eq 'discard') { |
} elsif ($env{'form.archive_'.$referrer{$i}} eq 'discard') { |
$warning .= &mt('[_1] is a dependency of [_2], which was discarded.', |
$warning .= &mt('[_1] is a dependency of [_2], which was discarded.', |
&HTML::Entities::encode($path,'<>&"'), |
$path,$env{'form.archive_content_'.$referrer{$i}}).'<br />'; |
&HTML::Entities::encode($env{'form.archive_content_'.$referrer{$i}},'<>&"')). |
|
'<br />'; |
|
} |
} |
} else { |
} else { |
$warning .= &mt('Item extracted from archive: [_1] has unexpected path.', |
$warning .= &mt('Item extracted from archive: [_1] has unexpected path.',$path).'<br />'; |
&HTML::Entities::encode($path)).'<br />'; |
|
} |
} |
} |
} |
if (keys(%todelete)) { |
if (keys(%todelete)) { |
Line 13197 sub upfile_store {
|
Line 13544 sub upfile_store {
|
$env{'form.upfile'}=~s/\n+/\n/gs; |
$env{'form.upfile'}=~s/\n+/\n/gs; |
$env{'form.upfile'}=~s/\n+$//gs; |
$env{'form.upfile'}=~s/\n+$//gs; |
|
|
my $datatoken = &valid_datatoken($env{'user.name'}.'_'.$env{'user.domain'}. |
my $datatoken=$env{'user.name'}.'_'.$env{'user.domain'}. |
'_enroll_'.$env{'request.course.id'}.'_'. |
'_enroll_'.$env{'request.course.id'}.'_'.time.'_'.$$; |
time.'_'.$$); |
|
return if ($datatoken eq ''); |
|
{ |
{ |
my $datafile = $r->dir_config('lonDaemons'). |
my $datafile = $r->dir_config('lonDaemons'). |
'/tmp/'.$datatoken.'.tmp'; |
'/tmp/'.$datatoken.'.tmp'; |
if ( open(my $fh,'>',$datafile) ) { |
if ( open(my $fh,">$datafile") ) { |
print $fh $env{'form.upfile'}; |
print $fh $env{'form.upfile'}; |
close($fh); |
close($fh); |
} |
} |
Line 13214 sub upfile_store {
|
Line 13559 sub upfile_store {
|
|
|
=pod |
=pod |
|
|
=item * &load_tmp_file($r,$datatoken) |
=item * &load_tmp_file($r) |
|
|
Load uploaded file from tmp, $r should be the HTTP Request object, |
Load uploaded file from tmp, $r should be the HTTP Request object, |
$datatoken is the name to assign to the temporary file. |
needs $env{'form.datatoken'}, |
sets $env{'form.upfile'} to the contents of the file |
sets $env{'form.upfile'} to the contents of the file |
|
|
=cut |
=cut |
|
|
sub load_tmp_file { |
sub load_tmp_file { |
my ($r,$datatoken) = @_; |
my $r=shift; |
return if ($datatoken eq ''); |
|
my @studentdata=(); |
my @studentdata=(); |
{ |
{ |
my $studentfile = $r->dir_config('lonDaemons'). |
my $studentfile = $r->dir_config('lonDaemons'). |
'/tmp/'.$datatoken.'.tmp'; |
'/tmp/'.$env{'form.datatoken'}.'.tmp'; |
if ( open(my $fh,'<',$studentfile) ) { |
if ( open(my $fh,"<$studentfile") ) { |
@studentdata=<$fh>; |
@studentdata=<$fh>; |
close($fh); |
close($fh); |
} |
} |
Line 13237 sub load_tmp_file {
|
Line 13581 sub load_tmp_file {
|
$env{'form.upfile'}=join('',@studentdata); |
$env{'form.upfile'}=join('',@studentdata); |
} |
} |
|
|
sub valid_datatoken { |
|
my ($datatoken) = @_; |
|
if ($datatoken =~ /^$match_username\_$match_domain\_enroll_(|$match_domain\_$match_courseid)\_\d+_\d+$/) { |
|
return $datatoken; |
|
} |
|
return; |
|
} |
|
|
|
=pod |
=pod |
|
|
=item * &upfile_record_sep() |
=item * &upfile_record_sep() |
Line 13685 sub DrawBarGraph {
|
Line 14021 sub DrawBarGraph {
|
@Labels = @$labels; |
@Labels = @$labels; |
} else { |
} else { |
for (my $i=0;$i<@{$Values[0]};$i++) { |
for (my $i=0;$i<@{$Values[0]};$i++) { |
push(@Labels,$i+1); |
push (@Labels,$i+1); |
} |
} |
} |
} |
# |
# |
Line 14124 generated by lonerrorhandler.pm, CHECKRP
|
Line 14460 generated by lonerrorhandler.pm, CHECKRP
|
lonsupportreq.pm, loncoursequeueadmin.pm, searchcat.pl respectively. |
lonsupportreq.pm, loncoursequeueadmin.pm, searchcat.pl respectively. |
|
|
Inputs: |
Inputs: |
defmail (scalar - email address of default recipient), |
defmail (scalar - email address of default recipient), |
mailing type (scalar: errormail, packagesmail, helpdeskmail, |
mailing type (scalar: errormail, packagesmail, helpdeskmail, |
requestsmail, updatesmail, or idconflictsmail). |
requestsmail, updatesmail, or idconflictsmail). |
|
|
defdom (domain for which to retrieve configuration settings), |
defdom (domain for which to retrieve configuration settings), |
|
|
origmail (scalar - email address of recipient from loncapa.conf, |
origmail (scalar - email address of recipient from loncapa.conf, |
i.e., predates configuration by DC via domainprefs.pm |
i.e., predates configuration by DC via domainprefs.pm |
|
|
$requname username of requester (if mailing type is helpdeskmail) |
|
|
|
$requdom domain of requester (if mailing type is helpdeskmail) |
|
|
|
$reqemail e-mail address of requester (if mailing type is helpdeskmail) |
|
|
|
|
|
Returns: comma separated list of addresses to which to send e-mail. |
Returns: comma separated list of addresses to which to send e-mail. |
|
|
Line 14149 Returns: comma separated list of address
|
Line 14478 Returns: comma separated list of address
|
############################################################ |
############################################################ |
############################################################ |
############################################################ |
sub build_recipient_list { |
sub build_recipient_list { |
my ($defmail,$mailing,$defdom,$origmail,$requname,$requdom,$reqemail) = @_; |
my ($defmail,$mailing,$defdom,$origmail) = @_; |
my @recipients; |
my @recipients; |
my ($otheremails,$lastresort,$allbcc,$addtext); |
my $otheremails; |
my %domconfig = |
my %domconfig = |
&Apache::lonnet::get_dom('configuration',['contacts'],$defdom); |
&Apache::lonnet::get_dom('configuration',['contacts'],$defdom); |
if (ref($domconfig{'contacts'}) eq 'HASH') { |
if (ref($domconfig{'contacts'}) eq 'HASH') { |
if (exists($domconfig{'contacts'}{$mailing})) { |
if (exists($domconfig{'contacts'}{$mailing})) { |
if (ref($domconfig{'contacts'}{$mailing}) eq 'HASH') { |
if (ref($domconfig{'contacts'}{$mailing}) eq 'HASH') { |
Line 14165 sub build_recipient_list {
|
Line 14494 sub build_recipient_list {
|
push(@recipients,$addr); |
push(@recipients,$addr); |
} |
} |
} |
} |
} |
$otheremails = $domconfig{'contacts'}{$mailing}{'others'}; |
$otheremails = $domconfig{'contacts'}{$mailing}{'others'}; |
|
if ($mailing eq 'helpdeskmail') { |
|
if ($domconfig{'contacts'}{$mailing}{'bcc'}) { |
|
my @bccs = split(/,/,$domconfig{'contacts'}{$mailing}{'bcc'}); |
|
my @ok_bccs; |
|
foreach my $bcc (@bccs) { |
|
$bcc =~ s/^\s+//g; |
|
$bcc =~ s/\s+$//g; |
|
if ($bcc =~ m/^[^\@]+\@[^\@]+$/) { |
|
if (!(grep(/^\Q$bcc\E$/,@ok_bccs))) { |
|
push(@ok_bccs,$bcc); |
|
} |
|
} |
|
} |
|
if (@ok_bccs > 0) { |
|
$allbcc = join(', ',@ok_bccs); |
|
} |
|
} |
|
$addtext = $domconfig{'contacts'}{$mailing}{'include'}; |
|
} |
} |
} |
} |
} elsif ($origmail ne '') { |
} elsif ($origmail ne '') { |
$lastresort = $origmail; |
push(@recipients,$origmail); |
} |
|
if ($mailing eq 'helpdeskmail') { |
|
if ((ref($domconfig{'contacts'}{'overrides'}) eq 'HASH') && |
|
(keys(%{$domconfig{'contacts'}{'overrides'}}))) { |
|
my ($inststatus,$inststatus_checked); |
|
if (($env{'user.name'} ne '') && ($env{'user.domain'} ne '') && |
|
($env{'user.domain'} ne 'public')) { |
|
$inststatus_checked = 1; |
|
$inststatus = $env{'environment.inststatus'}; |
|
} |
|
unless ($inststatus_checked) { |
|
if (($requname ne '') && ($requdom ne '')) { |
|
if (($requname =~ /^$match_username$/) && |
|
($requdom =~ /^$match_domain$/) && |
|
(&Apache::lonnet::domain($requdom))) { |
|
my $requhome = &Apache::lonnet::homeserver($requname, |
|
$requdom); |
|
unless ($requhome eq 'no_host') { |
|
my %userenv = &Apache::lonnet::userenvironment($requdom,$requname,'inststatus'); |
|
$inststatus = $userenv{'inststatus'}; |
|
$inststatus_checked = 1; |
|
} |
|
} |
|
} |
|
} |
|
unless ($inststatus_checked) { |
|
if ($reqemail =~ /^[^\@]+\@[^\@]+$/) { |
|
my %srch = (srchby => 'email', |
|
srchdomain => $defdom, |
|
srchterm => $reqemail, |
|
srchtype => 'exact'); |
|
my %srch_results = &Apache::lonnet::usersearch(\%srch); |
|
foreach my $uname (keys(%srch_results)) { |
|
if (ref($srch_results{$uname}{'inststatus'}) eq 'ARRAY') { |
|
$inststatus = join(',',@{$srch_results{$uname}{'inststatus'}}); |
|
$inststatus_checked = 1; |
|
last; |
|
} |
|
} |
|
unless ($inststatus_checked) { |
|
my ($dirsrchres,%srch_results) = &Apache::lonnet::inst_directory_query(\%srch); |
|
if ($dirsrchres eq 'ok') { |
|
foreach my $uname (keys(%srch_results)) { |
|
if (ref($srch_results{$uname}{'inststatus'}) eq 'ARRAY') { |
|
$inststatus = join(',',@{$srch_results{$uname}{'inststatus'}}); |
|
$inststatus_checked = 1; |
|
last; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
if ($inststatus ne '') { |
|
foreach my $status (split(/\:/,$inststatus)) { |
|
if (ref($domconfig{'contacts'}{'overrides'}{$status}) eq 'HASH') { |
|
my @contacts = ('adminemail','supportemail'); |
|
foreach my $item (@contacts) { |
|
if ($domconfig{'contacts'}{'overrides'}{$status}{$item}) { |
|
my $addr = $domconfig{'contacts'}{'overrides'}{$status}; |
|
if (!grep(/^\Q$addr\E$/,@recipients)) { |
|
push(@recipients,$addr); |
|
} |
|
} |
|
} |
|
$otheremails = $domconfig{'contacts'}{'overrides'}{$status}{'others'}; |
|
if ($domconfig{'contacts'}{'overrides'}{$status}{'bcc'}) { |
|
my @bccs = split(/,/,$domconfig{'contacts'}{'overrides'}{$status}{'bcc'}); |
|
my @ok_bccs; |
|
foreach my $bcc (@bccs) { |
|
$bcc =~ s/^\s+//g; |
|
$bcc =~ s/\s+$//g; |
|
if ($bcc =~ m/^[^\@]+\@[^\@]+$/) { |
|
if (!(grep(/^\Q$bcc\E$/,@ok_bccs))) { |
|
push(@ok_bccs,$bcc); |
|
} |
|
} |
|
} |
|
if (@ok_bccs > 0) { |
|
$allbcc = join(', ',@ok_bccs); |
|
} |
|
} |
|
$addtext = $domconfig{'contacts'}{'overrides'}{$status}{'include'}; |
|
last; |
|
} |
|
} |
|
} |
|
} |
|
} |
} |
} elsif ($origmail ne '') { |
} elsif ($origmail ne '') { |
$lastresort = $origmail; |
push(@recipients,$origmail); |
} |
|
|
|
if (($mailing eq 'helpdeskmail') && ($lastresort ne '')) { |
|
unless (grep(/^\Q$defdom\E$/,&Apache::lonnet::current_machine_domains())) { |
|
my $lonhost = $Apache::lonnet::perlvar{'lonHostID'}; |
|
my $machinedom = $Apache::lonnet::perlvar{'lonDefDomain'}; |
|
my %what = ( |
|
perlvar => 1, |
|
); |
|
my $primary = &Apache::lonnet::domain($defdom,'primary'); |
|
if ($primary) { |
|
my $gotaddr; |
|
my ($result,$returnhash) = |
|
&Apache::lonnet::get_remote_globals($primary,{ perlvar => 1 }); |
|
if (($result eq 'ok') && (ref($returnhash) eq 'HASH')) { |
|
if ($returnhash->{'lonSupportEMail'} =~ /^[^\@]+\@[^\@]+$/) { |
|
$lastresort = $returnhash->{'lonSupportEMail'}; |
|
$gotaddr = 1; |
|
} |
|
} |
|
unless ($gotaddr) { |
|
my $uintdom = &Apache::lonnet::internet_dom($primary); |
|
my $intdom = &Apache::lonnet::internet_dom($lonhost); |
|
unless ($uintdom eq $intdom) { |
|
my %domconfig = |
|
&Apache::lonnet::get_dom('configuration',['contacts'],$machinedom); |
|
if (ref($domconfig{'contacts'}) eq 'HASH') { |
|
if (ref($domconfig{'contacts'}{'otherdomsmail'}) eq 'HASH') { |
|
my @contacts = ('adminemail','supportemail'); |
|
foreach my $item (@contacts) { |
|
if ($domconfig{'contacts'}{'otherdomsmail'}{$item}) { |
|
my $addr = $domconfig{'contacts'}{$item}; |
|
if (!grep(/^\Q$addr\E$/,@recipients)) { |
|
push(@recipients,$addr); |
|
} |
|
} |
|
} |
|
if ($domconfig{'contacts'}{'otherdomsmail'}{'others'}) { |
|
$otheremails = $domconfig{'contacts'}{'otherdomsmail'}{'others'}; |
|
} |
|
if ($domconfig{'contacts'}{'otherdomsmail'}{'bcc'}) { |
|
my @bccs = split(/,/,$domconfig{'contacts'}{'otherdomsmail'}{'bcc'}); |
|
my @ok_bccs; |
|
foreach my $bcc (@bccs) { |
|
$bcc =~ s/^\s+//g; |
|
$bcc =~ s/\s+$//g; |
|
if ($bcc =~ m/^[^\@]+\@[^\@]+$/) { |
|
if (!(grep(/^\Q$bcc\E$/,@ok_bccs))) { |
|
push(@ok_bccs,$bcc); |
|
} |
|
} |
|
} |
|
if (@ok_bccs > 0) { |
|
$allbcc = join(', ',@ok_bccs); |
|
} |
|
} |
|
$addtext = $domconfig{'contacts'}{'otherdomsmail'}{'include'}; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
} |
if (defined($defmail)) { |
if (defined($defmail)) { |
if ($defmail ne '') { |
if ($defmail ne '') { |
Line 14362 sub build_recipient_list {
|
Line 14521 sub build_recipient_list {
|
} |
} |
} |
} |
} |
} |
if ($mailing eq 'helpdeskmail') { |
my $recipientlist = join(',',@recipients); |
if ((!@recipients) && ($lastresort ne '')) { |
return $recipientlist; |
push(@recipients,$lastresort); |
} |
} |
|
} elsif ($lastresort ne '') { |
############################################################ |
if (!grep(/^\Q$lastresort\E$/,@recipients)) { |
############################################################ |
push(@recipients,$lastresort); |
|
} |
=pod |
|
|
|
=over 4 |
|
|
|
=item * &mime_email() |
|
|
|
Sends an email with a possible attachment |
|
|
|
Inputs: |
|
|
|
=over 4 |
|
|
|
from - Sender's email address |
|
|
|
to - Email address of recipient |
|
|
|
subject - Subject of email |
|
|
|
body - Body of email |
|
|
|
cc_string - Carbon copy email address |
|
|
|
bcc - Blind carbon copy email address |
|
|
|
type - File type of attachment |
|
|
|
attachment_path - Path of file to be attached |
|
|
|
file_name - Name of file to be attached |
|
|
|
attachment_text - The body of an attachment of type "TEXT" |
|
|
|
=back |
|
|
|
=back |
|
|
|
=cut |
|
|
|
############################################################ |
|
############################################################ |
|
|
|
sub mime_email { |
|
my ($from, $to, $subject, $body, $cc_string, $bcc, $attachment_path, |
|
$file_name, $attachment_text) = @_; |
|
my $msg = MIME::Lite->new( |
|
From => $from, |
|
To => $to, |
|
Subject => $subject, |
|
Type =>'TEXT', |
|
Data => $body, |
|
); |
|
if ($cc_string ne '') { |
|
$msg->add("Cc" => $cc_string); |
} |
} |
my $recipientlist = join(',',@recipients); |
if ($bcc ne '') { |
if (wantarray) { |
$msg->add("Bcc" => $bcc); |
return ($recipientlist,$allbcc,$addtext); |
} |
} else { |
$msg->attr("content-type" => "text/plain"); |
return $recipientlist; |
$msg->attr("content-type.charset" => "UTF-8"); |
|
# Attach file if given |
|
if ($attachment_path) { |
|
unless ($file_name) { |
|
if ($attachment_path =~ m-/([^/]+)$-) { $file_name = $1; } |
|
} |
|
my ($type, $encoding) = MIME::Types::by_suffix($attachment_path); |
|
$msg->attach(Type => $type, |
|
Path => $attachment_path, |
|
Filename => $file_name |
|
); |
|
# Otherwise attach text if given |
|
} elsif ($attachment_text) { |
|
$msg->attach(Type => 'TEXT', |
|
Data => $attachment_text); |
} |
} |
|
# Send it |
|
$msg->send('sendmail'); |
} |
} |
|
|
############################################################ |
############################################################ |
Line 14486 sub extract_categories {
|
Line 14713 sub extract_categories {
|
$trailstr = &mt('Official courses (with institutional codes)'); |
$trailstr = &mt('Official courses (with institutional codes)'); |
} elsif ($name eq 'communities') { |
} elsif ($name eq 'communities') { |
$trailstr = &mt('Communities'); |
$trailstr = &mt('Communities'); |
|
} elsif ($name eq 'placement') { |
|
$trailstr = &mt('Placement Tests'); |
} else { |
} else { |
$trailstr = $name; |
$trailstr = $name; |
} |
} |
Line 14627 sub assign_categories_table {
|
Line 14856 sub assign_categories_table {
|
next if ($parent eq 'instcode'); |
next if ($parent eq 'instcode'); |
if ($type eq 'Community') { |
if ($type eq 'Community') { |
next unless ($parent eq 'communities'); |
next unless ($parent eq 'communities'); |
|
} elsif ($type eq 'Placement') { |
|
next unless ($parent eq 'placement'); |
} else { |
} else { |
next if ($parent eq 'communities'); |
next if (($parent eq 'communities') || ($parent eq 'placement')); |
} |
} |
my $css_class = $itemcount%2?' class="LC_odd_row"':''; |
my $css_class = $itemcount%2?' class="LC_odd_row"':''; |
my $item = &escape($parent).'::0'; |
my $item = &escape($parent).'::0'; |
Line 14641 sub assign_categories_table {
|
Line 14872 sub assign_categories_table {
|
my $parent_title = $parent; |
my $parent_title = $parent; |
if ($parent eq 'communities') { |
if ($parent eq 'communities') { |
$parent_title = &mt('Communities'); |
$parent_title = &mt('Communities'); |
|
} elsif ($parent eq 'placement') { |
|
$parent_title = &mt('Placement Tests'); |
} |
} |
$table .= '<tr '.$css_class.'><td><span class="LC_nobreak">'. |
$table .= '<tr '.$css_class.'><td><span class="LC_nobreak">'. |
'<input type="checkbox" name="usecategory" value="'. |
'<input type="checkbox" name="usecategory" value="'. |
Line 14871 sub commit_studentrole {
|
Line 15104 sub commit_studentrole {
|
} |
} |
} |
} |
} else { |
} else { |
if ($secchange) { |
if ($secchange) { |
$$logmsg .= &mt('Error when attempting section change for [_1] from old section "[_2]" to new section: "[_3]" in course [_4] -error:',$uname,$oldsec,$sec,$cid).' '.$modify_section_result.$linefeed; |
$$logmsg .= &mt('Error when attempting section change for [_1] from old section "[_2]" to new section: "[_3]" in course [_4] -error:',$uname,$oldsec,$sec,$cid).' '.$modify_section_result.$linefeed; |
} else { |
} else { |
$$logmsg .= &mt('Error when attempting to modify role for [_1] for section: "[_2]" in course [_3] -error:',$uname,$sec,$cid).' '.$modify_section_result.$linefeed; |
$$logmsg .= &mt('Error when attempting to modify role for [_1] for section: "[_2]" in course [_3] -error:',$uname,$sec,$cid).' '.$modify_section_result.$linefeed; |
Line 14950 sub check_clone {
|
Line 15183 sub check_clone {
|
my %clonedesc = &Apache::lonnet::coursedescription($cloneid,{'one_time' => 1}); |
my %clonedesc = &Apache::lonnet::coursedescription($cloneid,{'one_time' => 1}); |
if ($args->{'crstype'} eq 'Community') { |
if ($args->{'crstype'} eq 'Community') { |
if ($clonedesc{'type'} ne 'Community') { |
if ($clonedesc{'type'} ne 'Community') { |
$clonemsg = &mt('No new community created.').$linefeed.&mt('A new community could not be cloned from the specified original - [_1] - because it is a course not a community.',$args->{'clonecourse'}.':'.$args->{'clonedomain'}); |
$clonemsg = &mt('No new community created.').$linefeed.&mt('A new community could not be cloned from the specified original - [_1] - because it is a course not a community.',$args->{'clonecourse'}.':'.$args->{'clonedomain'}); |
return ($can_clone, $clonemsg, $cloneid, $clonehome); |
return ($can_clone, $clonemsg, $cloneid, $clonehome); |
} |
} |
} |
} |
Line 14968 sub check_clone {
|
Line 15201 sub check_clone {
|
if ($args->{'ccdomain'} eq $args->{'clonedomain'}) { |
if ($args->{'ccdomain'} eq $args->{'clonedomain'}) { |
$can_clone = 1; |
$can_clone = 1; |
} |
} |
} elsif (($clonehash{'internal.coursecode'}) && ($args->{'crscode'}) && |
} elsif (($clonehash{'internal.coursecode'}) && ($args->{'crscode'}) && |
($args->{'clonedomain'} eq $args->{'course_domain'})) { |
($args->{'clonedomain'} eq $args->{'course_domain'})) { |
if (&Apache::lonnet::default_instcode_cloning($args->{'clonedomain'},$domdefs{'canclone'}, |
if (&Apache::lonnet::default_instcode_cloning($args->{'clonedomain'},$domdefs{'canclone'}, |
$clonehash{'internal.coursecode'},$args->{'crscode'})) { |
$clonehash{'internal.coursecode'},$args->{'crscode'})) { |
Line 14987 sub check_clone {
|
Line 15220 sub check_clone {
|
$can_clone = 1; |
$can_clone = 1; |
} |
} |
unless ($can_clone) { |
unless ($can_clone) { |
if (($clonehash{'internal.coursecode'}) && ($args->{'crscode'}) && |
if (($clonehash{'internal.coursecode'}) && ($args->{'crscode'}) && |
($args->{'clonedomain'} eq $args->{'course_domain'})) { |
($args->{'clonedomain'} eq $args->{'course_domain'})) { |
my (%gotdomdefaults,%gotcodedefaults); |
my (%gotdomdefaults,%gotcodedefaults); |
foreach my $cloner (@cloners) { |
foreach my $cloner (@cloners) { |
Line 15026 sub check_clone {
|
Line 15259 sub check_clone {
|
if ($args->{'crstype'} eq 'Community') { |
if ($args->{'crstype'} eq 'Community') { |
$ccrole = 'co'; |
$ccrole = 'co'; |
} |
} |
my %roleshash = |
my %roleshash = |
&Apache::lonnet::get_my_roles($args->{'ccuname'}, |
&Apache::lonnet::get_my_roles($args->{'ccuname'}, |
$args->{'ccdomain'}, |
$args->{'ccdomain'}, |
'userroles',['active'],[$ccrole], |
'userroles',['active'],[$ccrole], |
[$args->{'clonedomain'}]); |
[$args->{'clonedomain'}]); |
if ($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':'.$ccrole}) { |
if ($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':'.$ccrole}) { |
$can_clone = 1; |
$can_clone = 1; |
} elsif (&Apache::lonnet::is_course_owner($args->{'clonedomain'},$args->{'clonecourse'}, |
} elsif (&Apache::lonnet::is_course_owner($args->{'clonedomain'},$args->{'clonecourse'}, |
$args->{'ccuname'},$args->{'ccdomain'})) { |
$args->{'ccuname'},$args->{'ccdomain'})) { |
Line 15043 sub check_clone {
|
Line 15276 sub check_clone {
|
$clonemsg = &mt('No new community created.').$linefeed.&mt('The new community could not be cloned from the existing community because the new community owner ([_1]) does not have cloning rights in the existing community ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'}); |
$clonemsg = &mt('No new community created.').$linefeed.&mt('The new community could not be cloned from the existing community because the new community owner ([_1]) does not have cloning rights in the existing community ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'}); |
} else { |
} else { |
$clonemsg = &mt('No new course created.').$linefeed.&mt('The new course could not be cloned from the existing course because the new course owner ([_1]) does not have cloning rights in the existing course ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'}); |
$clonemsg = &mt('No new course created.').$linefeed.&mt('The new course could not be cloned from the existing course because the new course owner ([_1]) does not have cloning rights in the existing course ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'}); |
} |
} |
} |
} |
} |
} |
} |
} |
Line 15080 sub construct_course {
|
Line 15313 sub construct_course {
|
# |
# |
# Open course |
# Open course |
# |
# |
my $crstype = lc($args->{'crstype'}); |
my $showncrstype; |
|
if ($args->{'crstype'} eq 'Placement') { |
|
$showncrstype = 'placement test'; |
|
} else { |
|
$showncrstype = lc($args->{'crstype'}); |
|
} |
my %cenv=(); |
my %cenv=(); |
$$courseid=&Apache::lonnet::createcourse($args->{'course_domain'}, |
$$courseid=&Apache::lonnet::createcourse($args->{'course_domain'}, |
$args->{'cdescr'}, |
$args->{'cdescr'}, |
Line 15097 sub construct_course {
|
Line 15335 sub construct_course {
|
# Utils::Course. This needs to at least be output as a comment |
# Utils::Course. This needs to at least be output as a comment |
# if anyone ever decides to not show this, and Utils::Course::new |
# if anyone ever decides to not show this, and Utils::Course::new |
# will need to be suitably modified. |
# will need to be suitably modified. |
$outcome .= &mt('New LON-CAPA [_1] ID: [_2]',$crstype,$$courseid).$linefeed; |
$outcome .= &mt('New LON-CAPA [_1] ID: [_2]',$showncrstype,$$courseid).$linefeed; |
if ($$courseid =~ /^error:/) { |
if ($$courseid =~ /^error:/) { |
return (0,$outcome); |
return (0,$outcome); |
} |
} |
Line 15117 sub construct_course {
|
Line 15355 sub construct_course {
|
# Do the cloning |
# Do the cloning |
# |
# |
if ($can_clone && $cloneid) { |
if ($can_clone && $cloneid) { |
$clonemsg = &mt('Cloning [_1] from [_2]',$crstype,$clonehome); |
$clonemsg = &mt('Cloning [_1] from [_2]',$showncrstype,$clonehome); |
if ($context ne 'auto') { |
if ($context ne 'auto') { |
$clonemsg = '<span class="LC_success">'.$clonemsg.'</span>'; |
$clonemsg = '<span class="LC_success">'.$clonemsg.'</span>'; |
} |
} |
Line 15200 sub construct_course {
|
Line 15438 sub construct_course {
|
my $addcheck = &Apache::lonnet::auto_new_course($$crsunum,$$crsudom,$class,$cenv{'internal.courseowner'}); |
my $addcheck = &Apache::lonnet::auto_new_course($$crsunum,$$crsudom,$class,$cenv{'internal.courseowner'}); |
$cenv{'internal.sectionnums'} .= $item.','; |
$cenv{'internal.sectionnums'} .= $item.','; |
unless ($addcheck eq 'ok') { |
unless ($addcheck eq 'ok') { |
push(@badclasses,$class); |
push @badclasses, $class; |
} |
} |
} |
} |
$cenv{'internal.sectionnums'} =~ s/,$//; |
$cenv{'internal.sectionnums'} =~ s/,$//; |
Line 15228 sub construct_course {
|
Line 15466 sub construct_course {
|
my $addcheck = &Apache::lonnet::auto_new_course($$crsunum,$$crsudom,$xl,$cenv{'internal.courseowner'}); |
my $addcheck = &Apache::lonnet::auto_new_course($$crsunum,$$crsudom,$xl,$cenv{'internal.courseowner'}); |
$cenv{'internal.crosslistings'} .= $item.','; |
$cenv{'internal.crosslistings'} .= $item.','; |
unless ($addcheck eq 'ok') { |
unless ($addcheck eq 'ok') { |
push(@badclasses,$xl); |
push @badclasses, $xl; |
} |
} |
} |
} |
$cenv{'internal.crosslistings'} =~ s/,$//; |
$cenv{'internal.crosslistings'} =~ s/,$//; |
Line 15263 sub construct_course {
|
Line 15501 sub construct_course {
|
} |
} |
if (@badclasses > 0) { |
if (@badclasses > 0) { |
my %lt=&Apache::lonlocal::texthash( |
my %lt=&Apache::lonlocal::texthash( |
'tclb' => 'The courses listed below were included as sections or crosslistings affiliated with your new LON-CAPA course.', |
'tclb' => 'The courses listed below were included as sections or crosslistings affiliated with your new LON-CAPA course. However, if automated course roster updates are enabled for this class, these particular sections/crosslistings will not contribute towards enrollment, because the user identified as the course owner for this LON-CAPA course', |
'howi' => 'However, if automated course roster updates are enabled for this class, these particular sections/crosslistings are not guaranteed to contribute towards enrollment.', |
'dnhr' => 'does not have rights to access enrollment in these classes', |
'itis' => 'It is possible that rights to access enrollment for these classes will be available through assignment of co-owners.', |
'adby' => 'as determined by the policies of your institution on access to official classlists' |
); |
); |
my $badclass_msg = $lt{'tclb'}.$linefeed.$lt{'howi'}.$linefeed. |
my $badclass_msg = $cenv{'internal.courseowner'}.') - '.$lt{'dnhr'}. |
&mt('That is because the user identified as the course owner ([_1]) does not have rights to access enrollment in these classes, as determined by the policies of your institution on access to official classlists',$cenv{'internal.courseowner'}).$linefeed.$lt{'itis'}; |
' ('.$lt{'adby'}.')'; |
if ($context eq 'auto') { |
if ($context eq 'auto') { |
$outcome .= $badclass_msg.$linefeed; |
$outcome .= $badclass_msg.$linefeed; |
} else { |
} else { |
Line 15285 sub construct_course {
|
Line 15523 sub construct_course {
|
$outcome .= $linefeed; |
$outcome .= $linefeed; |
} else { |
} else { |
$outcome .= "</ul><br /><br /></div>\n"; |
$outcome .= "</ul><br /><br /></div>\n"; |
} |
} |
} |
} |
if ($args->{'no_end_date'}) { |
if ($args->{'no_end_date'}) { |
$args->{'endaccess'} = 0; |
$args->{'endaccess'} = 0; |
Line 15354 sub construct_course {
|
Line 15592 sub construct_course {
|
if (ref($crsinfo{$$crsudom.'_'.$$crsunum}) eq 'HASH') { |
if (ref($crsinfo{$$crsudom.'_'.$$crsunum}) eq 'HASH') { |
$crsinfo{$$crsudom.'_'.$$crsunum}{'uniquecode'} = $code; |
$crsinfo{$$crsudom.'_'.$$crsunum}{'uniquecode'} = $code; |
my $putres = &Apache::lonnet::courseidput($$crsudom,\%crsinfo,$crsuhome,'notime'); |
my $putres = &Apache::lonnet::courseidput($$crsudom,\%crsinfo,$crsuhome,'notime'); |
} |
} |
if (ref($coderef)) { |
if (ref($coderef)) { |
$$coderef = $code; |
$$coderef = $code; |
} |
} |
Line 15426 sub construct_course {
|
Line 15664 sub construct_course {
|
$outcome .= ($fatal?$errtext:'write ok').$linefeed; |
$outcome .= ($fatal?$errtext:'write ok').$linefeed; |
} |
} |
|
|
|
# |
|
# Set params for Placement Tests |
|
# |
|
if ($args->{'crstype'} eq 'Placement') { |
|
my %storecontent; |
|
my $prefix=$$crsudom.'_'.$$crsunum.'.0.'; |
|
my %defaults = ( |
|
buttonshide => { value => 'yes', |
|
type => 'string_yesno',}, |
|
type => { value => 'randomizetry', |
|
type => 'string_questiontype',}, |
|
maxtries => { value => 1, |
|
type => 'int_pos',}, |
|
problemstatus => { value => 'no', |
|
type => 'string_problemstatus',}, |
|
); |
|
foreach my $key (keys(%defaults)) { |
|
$storecontent{$prefix.$key} = $defaults{$key}{'value'}; |
|
$storecontent{$prefix.$key.'.type'} = $defaults{$key}{'type'}; |
|
} |
|
&Apache::lonnet::cput |
|
('resourcedata',\%storecontent,$$crsudom,$$crsunum); |
|
} |
|
|
return (1,$outcome); |
return (1,$outcome); |
} |
} |
|
|
Line 15439 sub make_unique_code {
|
Line 15701 sub make_unique_code {
|
my $tries = 0; |
my $tries = 0; |
my $gotlock = &Apache::lonnet::newput_dom('uniquecodes',$lockhash,$cdom); |
my $gotlock = &Apache::lonnet::newput_dom('uniquecodes',$lockhash,$cdom); |
my ($code,$error); |
my ($code,$error); |
|
|
while (($gotlock ne 'ok') && ($tries<3)) { |
while (($gotlock ne 'ok') && ($tries<3)) { |
$tries ++; |
$tries ++; |
sleep 1; |
sleep 1; |
Line 15486 sub generate_code {
|
Line 15748 sub generate_code {
|
############################################################ |
############################################################ |
############################################################ |
############################################################ |
|
|
#SD |
# Community, Course and Placement Test |
# only Community and Course, or anything else? |
|
sub course_type { |
sub course_type { |
my ($cid) = @_; |
my ($cid) = @_; |
if (!defined($cid)) { |
if (!defined($cid)) { |
Line 15505 sub group_term {
|
Line 15766 sub group_term {
|
my %names = ( |
my %names = ( |
'Course' => 'group', |
'Course' => 'group', |
'Community' => 'group', |
'Community' => 'group', |
|
'Placement' => 'group', |
); |
); |
return $names{$crstype}; |
return $names{$crstype}; |
} |
} |
|
|
sub course_types { |
sub course_types { |
my @types = ('official','unofficial','community','textbook'); |
my @types = ('official','unofficial','community','textbook','placement'); |
my %typename = ( |
my %typename = ( |
official => 'Official course', |
official => 'Official course', |
unofficial => 'Unofficial course', |
unofficial => 'Unofficial course', |
community => 'Community', |
community => 'Community', |
textbook => 'Textbook course', |
textbook => 'Textbook course', |
|
placement => 'Placement test', |
); |
); |
return (\@types,\%typename); |
return (\@types,\%typename); |
} |
} |
Line 15665 sub init_user_environment {
|
Line 15928 sub init_user_environment {
|
|
|
my %userenv = &Apache::lonnet::dump('environment',$domain,$username); |
my %userenv = &Apache::lonnet::dump('environment',$domain,$username); |
my ($tmp) = keys(%userenv); |
my ($tmp) = keys(%userenv); |
if ($tmp =~ /^(con_lost|error|no_such_host)/i) { |
if ($tmp !~ /^(con_lost|error|no_such_host)/i) { |
|
} else { |
undef(%userenv); |
undef(%userenv); |
} |
} |
if (($userenv{'interface'}) && (!$form->{'interface'})) { |
if (($userenv{'interface'}) && (!$form->{'interface'})) { |
Line 15717 sub init_user_environment {
|
Line 15981 sub init_user_environment {
|
$env{'user.noloadbalance'} = $lonhost; |
$env{'user.noloadbalance'} = $lonhost; |
} |
} |
|
|
if ($form->{'noloadbalance'}) { |
my %is_adv = ( is_adv => $env{'user.adv'} ); |
my @hosts = &Apache::lonnet::current_machine_ids(); |
my %domdef; |
my $hosthere = $form->{'noloadbalance'}; |
|
if (grep(/^\Q$hosthere\E$/,@hosts)) { |
|
$initial_env{"user.noloadbalance"} = $hosthere; |
|
$env{'user.noloadbalance'} = $hosthere; |
|
} |
|
} |
|
|
|
unless ($domain eq 'public') { |
unless ($domain eq 'public') { |
my %is_adv = ( is_adv => $env{'user.adv'} ); |
%domdef = &Apache::lonnet::get_domain_defaults($domain); |
my %domdef = &Apache::lonnet::get_domain_defaults($domain); |
} |
|
|
foreach my $tool ('aboutme','blog','webdav','portfolio') { |
|
$userenv{'availabletools.'.$tool} = |
|
&Apache::lonnet::usertools_access($username,$domain,$tool,'reload', |
|
undef,\%userenv,\%domdef,\%is_adv); |
|
} |
|
|
|
foreach my $crstype ('official','unofficial','community','textbook') { |
foreach my $tool ('aboutme','blog','webdav','portfolio') { |
$userenv{'canrequest.'.$crstype} = |
$userenv{'availabletools.'.$tool} = |
&Apache::lonnet::usertools_access($username,$domain,$crstype, |
&Apache::lonnet::usertools_access($username,$domain,$tool,'reload', |
'reload','requestcourses', |
undef,\%userenv,\%domdef,\%is_adv); |
\%userenv,\%domdef,\%is_adv); |
} |
} |
|
|
|
$userenv{'canrequest.author'} = |
foreach my $crstype ('official','unofficial','community','textbook','placement') { |
&Apache::lonnet::usertools_access($username,$domain,'requestauthor', |
$userenv{'canrequest.'.$crstype} = |
'reload','requestauthor', |
&Apache::lonnet::usertools_access($username,$domain,$crstype, |
|
'reload','requestcourses', |
\%userenv,\%domdef,\%is_adv); |
\%userenv,\%domdef,\%is_adv); |
my %reqauthor = &Apache::lonnet::get('requestauthor',['author_status','author'], |
} |
$domain,$username); |
|
my $reqstatus = $reqauthor{'author_status'}; |
$userenv{'canrequest.author'} = |
if ($reqstatus eq 'approval' || $reqstatus eq 'approved') { |
&Apache::lonnet::usertools_access($username,$domain,'requestauthor', |
if (ref($reqauthor{'author'}) eq 'HASH') { |
'reload','requestauthor', |
$userenv{'requestauthorqueued'} = $reqstatus.':'. |
\%userenv,\%domdef,\%is_adv); |
$reqauthor{'author'}{'timestamp'}; |
my %reqauthor = &Apache::lonnet::get('requestauthor',['author_status','author'], |
} |
$domain,$username); |
|
my $reqstatus = $reqauthor{'author_status'}; |
|
if ($reqstatus eq 'approval' || $reqstatus eq 'approved') { |
|
if (ref($reqauthor{'author'}) eq 'HASH') { |
|
$userenv{'requestauthorqueued'} = $reqstatus.':'. |
|
$reqauthor{'author'}{'timestamp'}; |
} |
} |
} |
} |
|
|
Line 15861 and quotacheck.pl
|
Line 16117 and quotacheck.pl
|
|
|
Inputs: |
Inputs: |
|
|
filterlist - anonymous array of fields to include as potential filters |
filterlist - anonymous array of fields to include as potential filters |
|
|
crstype - course type |
crstype - course type |
|
|
roleelement - fifth arg in selectcourse_link() populates fifth arg in javascript: opencrsbrowser() function, used |
roleelement - fifth arg in selectcourse_link() populates fifth arg in javascript: opencrsbrowser() function, used |
to pop-open a course selector (will contain "extra element"). |
to pop-open a course selector (will contain "extra element"). |
|
|
multelement - if multiple course selections will be allowed, this will be a hidden form element: name: multiple; value: 1 |
multelement - if multiple course selections will be allowed, this will be a hidden form element: name: multiple; value: 1 |
|
|
Line 15882 cloneruname - username of owner of new c
|
Line 16138 cloneruname - username of owner of new c
|
|
|
clonerudom - domain of owner of new course who wants to clone |
clonerudom - domain of owner of new course who wants to clone |
|
|
typeelem - text to use for left column in row containing course type (i.e., Course, Community or Course/Community) |
typeelem - text to use for left column in row containing course type (i.e., Course, Community or Course/Community) |
|
|
codetitlesref - reference to array of titles of components in institutional codes (official courses) |
codetitlesref - reference to array of titles of components in institutional codes (official courses) |
|
|
codedom - domain |
codedom - domain |
|
|
formname - value of form element named "form". |
formname - value of form element named "form". |
|
|
fixeddom - domain, if fixed. |
fixeddom - domain, if fixed. |
|
|
prevphase - value to assign to form element named "phase" when going back to the previous screen |
prevphase - value to assign to form element named "phase" when going back to the previous screen |
|
|
cnameelement - name of form element in form on opener page which will receive title of selected course |
cnameelement - name of form element in form on opener page which will receive title of selected course |
|
|
cnumelement - name of form element in form on opener page which will receive courseID of selected course |
cnumelement - name of form element in form on opener page which will receive courseID of selected course |
|
|
Line 15985 sub build_filters {
|
Line 16241 sub build_filters {
|
$createdfilterform = &timebased_select_form('createdfilter',$filter); |
$createdfilterform = &timebased_select_form('createdfilter',$filter); |
} |
} |
|
|
|
my $prefix = $crstype; |
|
if ($crstype eq 'Placement') { |
|
$prefix = 'Placement Test' |
|
} |
my %lt = &Apache::lonlocal::texthash( |
my %lt = &Apache::lonlocal::texthash( |
'cac' => "$crstype Activity", |
'cac' => "$prefix Activity", |
'ccr' => "$crstype Created", |
'ccr' => "$prefix Created", |
'cde' => "$crstype Title", |
'cde' => "$prefix Title", |
'cdo' => "$crstype Domain", |
'cdo' => "$prefix Domain", |
'ins' => 'Institutional Code', |
'ins' => 'Institutional Code', |
'inc' => 'Institutional Categorization', |
'inc' => 'Institutional Categorization', |
'cow' => "$crstype Owner/Co-owner", |
'cow' => "$prefix Owner/Co-owner", |
'cop' => "$crstype Personnel Includes", |
'cop' => "$prefix Personnel Includes", |
'cog' => 'Type', |
'cog' => 'Type', |
); |
); |
|
|
Line 16001 sub build_filters {
|
Line 16261 sub build_filters {
|
my $typeval = 'Course'; |
my $typeval = 'Course'; |
if ($crstype eq 'Community') { |
if ($crstype eq 'Community') { |
$typeval = 'Community'; |
$typeval = 'Community'; |
|
} elsif ($crstype eq 'Placement') { |
|
$typeval = 'Placement'; |
} |
} |
$typeselectform = '<input type="hidden" name="type" value="'.$typeval.'" />'; |
$typeselectform = '<input type="hidden" name="type" value="'.$typeval.'" />'; |
} else { |
} else { |
Line 16009 sub build_filters {
|
Line 16271 sub build_filters {
|
$typeselectform .= ' onchange="'.$onchange.'"'; |
$typeselectform .= ' onchange="'.$onchange.'"'; |
} |
} |
$typeselectform .= '>'."\n"; |
$typeselectform .= '>'."\n"; |
foreach my $posstype ('Course','Community') { |
foreach my $posstype ('Course','Community','Placement') { |
|
my $shown; |
|
if ($posstype eq 'Placement') { |
|
$shown = &mt('Placement Test'); |
|
} else { |
|
$shown = &mt($posstype); |
|
} |
$typeselectform.='<option value="'.$posstype.'"'. |
$typeselectform.='<option value="'.$posstype.'"'. |
($posstype eq $crstype ? ' selected="selected" ' : ''). ">".&mt($posstype)."</option>\n"; |
($posstype eq $crstype ? ' selected="selected" ' : ''). ">".$shown."</option>\n"; |
} |
} |
$typeselectform.="</select>"; |
$typeselectform.="</select>"; |
} |
} |
Line 16036 sub build_filters {
|
Line 16304 sub build_filters {
|
if (exists($filter->{'instcodefilter'})) { |
if (exists($filter->{'instcodefilter'})) { |
# if (($fixeddom) || ($formname eq 'requestcrs') || |
# if (($fixeddom) || ($formname eq 'requestcrs') || |
# ($formname eq 'modifycourse') || ($formname eq 'filterpicker')) { |
# ($formname eq 'modifycourse') || ($formname eq 'filterpicker')) { |
if ($codedom) { |
if ($codedom) { |
$officialjs = 1; |
$officialjs = 1; |
($instcodeform,$jscript,$$numtitlesref) = |
($instcodeform,$jscript,$$numtitlesref) = |
&Apache::courseclassifier::instcode_selectors($codedom,'filterpicker', |
&Apache::courseclassifier::instcode_selectors($codedom,'filterpicker', |
Line 16165 $typeelement
|
Line 16433 $typeelement
|
return $jscript.$clonewarning.$output; |
return $jscript.$clonewarning.$output; |
} |
} |
|
|
=pod |
=pod |
|
|
=item * &timebased_select_form() |
=item * &timebased_select_form() |
|
|
Line 16180 item - name of form element (sincefilter
|
Line 16448 item - name of form element (sincefilter
|
filter - anonymous hash of criteria and their values |
filter - anonymous hash of criteria and their values |
|
|
Returns: HTML for a select box contained a blank, then six time selections, |
Returns: HTML for a select box contained a blank, then six time selections, |
with value set in incoming form variables currently selected. |
with value set in incoming form variables currently selected. |
|
|
Side Effects: None |
Side Effects: None |
|
|
Line 16217 page load completion for page showing se
|
Line 16485 page load completion for page showing se
|
|
|
Inputs: None |
Inputs: None |
|
|
Returns: markup containing updateFilters() and hideSearching() javascript functions. |
Returns: markup containing updateFilters() and hideSearching() javascript functions. |
|
|
Side Effects: None |
Side Effects: None |
|
|
Line 16256 to retrieve a hash for which keys are co
|
Line 16524 to retrieve a hash for which keys are co
|
|
|
Inputs: |
Inputs: |
|
|
dom - domain being searched |
dom - domain being searched |
|
|
type - course type ('Course' or 'Community' or '.' if any). |
type - course type ('Course' or 'Community' or '.' if any). |
|
|
Line 16268 cloneruname - optional username of new c
|
Line 16536 cloneruname - optional username of new c
|
|
|
clonerudom - optional domain of new course owner |
clonerudom - optional domain of new course owner |
|
|
domcloner - optional "domcloner" flag; has value=1 if user has ccc priv in domain being filtered by, |
domcloner - optional "domcloner" flag; has value=1 if user has ccc priv in domain being filtered by, |
(used when DC is using course creation form) |
(used when DC is using course creation form) |
|
|
codetitles - reference to array of titles of components in institutional codes (official courses). |
codetitles - reference to array of titles of components in institutional codes (official courses). |
Line 16278 cc_clone - escaped comma separated list
|
Line 16546 cc_clone - escaped comma separated list
|
|
|
reqcrsdom - domain of new course, where search_courses is used to identify potential courses to clone |
reqcrsdom - domain of new course, where search_courses is used to identify potential courses to clone |
|
|
reqinstcode - institutional code of new course, where search_courses is used to identify potential |
reqinstcode - institutional code of new course, where search_courses is used to identify potential |
courses to clone |
courses to clone |
|
|
Returns: %courses - hash of courses satisfying search criteria, keys = course IDs, values are corresponding colon-separated escaped description, institutional code, owner and type. |
Returns: %courses - hash of courses satisfying search criteria, keys = course IDs, values are corresponding colon-separated escaped description, institutional code, owner and type. |
|
|
Line 16362 sub search_courses {
|
Line 16630 sub search_courses {
|
if (ref($courses{$cid}) eq 'HASH') { |
if (ref($courses{$cid}) eq 'HASH') { |
if (ref($courses{$cid}{roles}) eq 'ARRAY') { |
if (ref($courses{$cid}{roles}) eq 'ARRAY') { |
if (!grep(/^\Q$courserole\E$/,@{$courses{$cid}{roles}})) { |
if (!grep(/^\Q$courserole\E$/,@{$courses{$cid}{roles}})) { |
push(@{$courses{$cid}{roles}},$courserole); |
push (@{$courses{$cid}{roles}},$courserole); |
} |
} |
} else { |
} else { |
$courses{$cid}{roles} = [$courserole]; |
$courses{$cid}{roles} = [$courserole]; |
Line 16405 $required - LON-CAPA version needed by c
|
Line 16673 $required - LON-CAPA version needed by c
|
|
|
Returns: |
Returns: |
|
|
$switchserver - query string tp append to /adm/switchserver call (if |
$switchserver - query string tp append to /adm/switchserver call (if |
current server's LON-CAPA version is too old. |
current server's LON-CAPA version is too old. |
|
|
$warning - Message is displayed if no suitable server could be found. |
$warning - Message is displayed if no suitable server could be found. |
|
|
Line 16519 Inputs:
|
Line 16787 Inputs:
|
$loncaparev - Version on current server (format: Major.Minor.Subrelease-datestamp) |
$loncaparev - Version on current server (format: Major.Minor.Subrelease-datestamp) |
|
|
$interval (optional) - Time which may elapse (in s) between last check for content |
$interval (optional) - Time which may elapse (in s) between last check for content |
change in current course. (default: 600 s). |
change in current course. (default: 600 s). |
|
|
Returns: an array; first element is: |
Returns: an array; first element is: |
|
|
Line 16527 Returns: an array; first element is:
|
Line 16795 Returns: an array; first element is:
|
|
|
'switch' - if content updates mean user's session |
'switch' - if content updates mean user's session |
needs to be switched to a server running a newer LON-CAPA version |
needs to be switched to a server running a newer LON-CAPA version |
|
|
'update' - if course session needs to be refreshed (i.e., Big Hash needs to be reloaded) |
'update' - if course session needs to be refreshed (i.e., Big Hash needs to be reloaded) |
on current server hosting user's session |
on current server hosting user's session |
|
|
'' - if no action required. |
'' - if no action required. |
|
|
Line 16537 Returns: an array; first element is:
|
Line 16805 Returns: an array; first element is:
|
|
|
If first item element is 'switch': |
If first item element is 'switch': |
|
|
second item is $switchwarning - Warning message if no suitable server found to host session. |
second item is $switchwarning - Warning message if no suitable server found to host session. |
|
|
third item is $switchserver - query string to append to /adm/switchserver containing lonHostID |
third item is $switchserver - query string to append to /adm/switchserver containing lonHostID |
and current role. |
and current role. |
|
|
otherwise: no other elements returned. |
otherwise: no other elements returned. |
|
|
Line 16558 sub needs_coursereinit {
|
Line 16826 sub needs_coursereinit {
|
$interval = 600; |
$interval = 600; |
} |
} |
if (($now-$env{'request.course.timechecked'})>$interval) { |
if (($now-$env{'request.course.timechecked'})>$interval) { |
&Apache::lonnet::appenv({'request.course.timechecked'=>$now}); |
|
my $blocked = &blocking_status('reinit',$cnum,$cdom,undef,1); |
|
if ($blocked) { |
|
return (); |
|
} |
|
my $lastchange = &Apache::lonnet::get_coursechange($cdom,$cnum); |
my $lastchange = &Apache::lonnet::get_coursechange($cdom,$cnum); |
|
&Apache::lonnet::appenv({'request.course.timechecked'=>$now}); |
if ($lastchange > $env{'request.course.tied'}) { |
if ($lastchange > $env{'request.course.tied'}) { |
my %curr_reqd_hash = &Apache::lonnet::userenvironment($cdom,$cnum,'internal.releaserequired'); |
my %curr_reqd_hash = &Apache::lonnet::userenvironment($cdom,$cnum,'internal.releaserequired'); |
if ($curr_reqd_hash{'internal.releaserequired'} ne '') { |
if ($curr_reqd_hash{'internal.releaserequired'} ne '') { |
Line 16696 sub recurse_supplemental {
|
Line 16960 sub recurse_supplemental {
|
} |
} |
|
|
sub symb_to_docspath { |
sub symb_to_docspath { |
my ($symb,$navmapref) = @_; |
my ($symb) = @_; |
return unless ($symb && ref($navmapref)); |
return unless ($symb); |
my ($mapurl,$id,$resurl) = &Apache::lonnet::decode_symb($symb); |
my ($mapurl,$id,$resurl) = &Apache::lonnet::decode_symb($symb); |
if ($resurl=~/\.(sequence|page)$/) { |
if ($resurl=~/\.(sequence|page)$/) { |
$mapurl=$resurl; |
$mapurl=$resurl; |
Line 16705 sub symb_to_docspath {
|
Line 16969 sub symb_to_docspath {
|
$mapurl=$env{'course.'.$env{'request.course.id'}.'.url'}; |
$mapurl=$env{'course.'.$env{'request.course.id'}.'.url'}; |
} |
} |
my $mapresobj; |
my $mapresobj; |
unless (ref($$navmapref)) { |
my $navmap = Apache::lonnavmaps::navmap->new(); |
$$navmapref = Apache::lonnavmaps::navmap->new(); |
if (ref($navmap)) { |
} |
$mapresobj = $navmap->getResourceByUrl($mapurl); |
if (ref($$navmapref)) { |
|
$mapresobj = $$navmapref->getResourceByUrl($mapurl); |
|
} |
} |
$mapurl=~s{^.*/([^/]+)\.(\w+)$}{$1}; |
$mapurl=~s{^.*/([^/]+)\.(\w+)$}{$1}; |
my $type=$2; |
my $type=$2; |
Line 16719 sub symb_to_docspath {
|
Line 16981 sub symb_to_docspath {
|
if ($pcslist ne '') { |
if ($pcslist ne '') { |
foreach my $pc (split(/,/,$pcslist)) { |
foreach my $pc (split(/,/,$pcslist)) { |
next if ($pc <= 1); |
next if ($pc <= 1); |
my $res = $$navmapref->getByMapPc($pc); |
my $res = $navmap->getByMapPc($pc); |
if (ref($res)) { |
if (ref($res)) { |
my $thisurl = $res->src(); |
my $thisurl = $res->src(); |
$thisurl=~s{^.*/([^/]+)\.\w+$}{$1}; |
$thisurl=~s{^.*/([^/]+)\.\w+$}{$1}; |
Line 16768 sub symb_to_docspath {
|
Line 17030 sub symb_to_docspath {
|
sub captcha_display { |
sub captcha_display { |
my ($context,$lonhost) = @_; |
my ($context,$lonhost) = @_; |
my ($output,$error); |
my ($output,$error); |
my ($captcha,$pubkey,$privkey,$version) = |
my ($captcha,$pubkey,$privkey,$version) = |
&get_captcha_config($context,$lonhost); |
&get_captcha_config($context,$lonhost); |
if ($captcha eq 'original') { |
if ($captcha eq 'original') { |
$output = &create_captcha(); |
$output = &create_captcha(); |
Line 16839 sub get_captcha_config {
|
Line 17101 sub get_captcha_config {
|
$captcha = 'recaptcha'; |
$captcha = 'recaptcha'; |
$version = $domconfhash{$serverhomedom.'.login.recaptchaversion'}; |
$version = $domconfhash{$serverhomedom.'.login.recaptchaversion'}; |
if ($version ne '2') { |
if ($version ne '2') { |
$version = 1; |
$version = 1; |
} |
} |
} else { |
} else { |
$captcha = 'original'; |
$captcha = 'original'; |
Line 16921 sub create_recaptcha {
|
Line 17183 sub create_recaptcha {
|
&mt('If the text is hard to read, [_1] will replace them.', |
&mt('If the text is hard to read, [_1] will replace them.', |
'<img src="/res/adm/pages/refresh.gif" alt="reCAPTCHA refresh" />'). |
'<img src="/res/adm/pages/refresh.gif" alt="reCAPTCHA refresh" />'). |
'<br /><br />'; |
'<br /><br />'; |
} |
} |
} |
} |
|
|
sub check_recaptcha { |
sub check_recaptcha { |
Line 16931 sub check_recaptcha {
|
Line 17193 sub check_recaptcha {
|
my $ua = LWP::UserAgent->new; |
my $ua = LWP::UserAgent->new; |
$ua->timeout(10); |
$ua->timeout(10); |
my %info = ( |
my %info = ( |
secret => $privkey, |
secret => $privkey, |
response => $env{'form.g-recaptcha-response'}, |
response => $env{'form.g-recaptcha-response'}, |
remoteip => $ENV{'REMOTE_ADDR'}, |
remoteip => $ENV{'REMOTE_ADDR'}, |
); |
); |
Line 16998 sub cleanup_html {
|
Line 17260 sub cleanup_html {
|
|
|
# Checks for critical messages and returns a redirect url if one exists. |
# Checks for critical messages and returns a redirect url if one exists. |
# $interval indicates how often to check for messages. |
# $interval indicates how often to check for messages. |
# $context is the calling context -- roles, grades, contents, menu or flip. |
|
sub critical_redirect { |
sub critical_redirect { |
my ($interval,$context) = @_; |
my ($interval) = @_; |
if ((time-$env{'user.criticalcheck.time'})>$interval) { |
if ((time-$env{'user.criticalcheck.time'})>$interval) { |
if (($env{'request.course.id'}) && (($context eq 'flip') || ($context eq 'contents'))) { |
my @what=&Apache::lonnet::dump('critical', $env{'user.domain'}, |
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
my $blocked = &blocking_status('alert',$cnum,$cdom,undef,1); |
|
if ($blocked) { |
|
my $checkrole = "cm./$cdom/$cnum"; |
|
if ($env{'request.course.sec'} ne '') { |
|
$checkrole .= "/$env{'request.course.sec'}"; |
|
} |
|
unless ((&Apache::lonnet::allowed('evb',undef,undef,$checkrole)) && |
|
($env{'request.role'} !~ m{^st\./$cdom/$cnum})) { |
|
return; |
|
} |
|
} |
|
} |
|
my @what=&Apache::lonnet::dump('critical', $env{'user.domain'}, |
|
$env{'user.name'}); |
$env{'user.name'}); |
&Apache::lonnet::appenv({'user.criticalcheck.time'=>time}); |
&Apache::lonnet::appenv({'user.criticalcheck.time'=>time}); |
my $redirecturl; |
my $redirecturl; |
if ($what[0]) { |
if ($what[0]) { |
if (($what[0] ne 'con_lost') && ($what[0]!~/^error\:/)) { |
if (($what[0] ne 'con_lost') && ($what[0]!~/^error\:/)) { |
$redirecturl='/adm/email?critical=display'; |
$redirecturl='/adm/email?critical=display'; |
my $url=&Apache::lonnet::absolute_url().$redirecturl; |
my $url=&Apache::lonnet::absolute_url().$redirecturl; |
return (1, $url); |
return (1, $url); |
} |
} |
} |
} |
} |
} |
return (); |
return (); |
} |
} |
|
|
Line 17082 sub des_decrypt {
|
Line 17328 sub des_decrypt {
|
return $plaintext; |
return $plaintext; |
} |
} |
|
|
sub make_short_symbs { |
|
my ($cdom,$cnum,$navmap) = @_; |
|
return unless (ref($navmap)); |
|
my ($numnew,@errors); |
|
my @toshorten = &Apache::loncommon::get_env_multiple('form.addtiny'); |
|
if (@toshorten) { |
|
my (%maps,%resources,%titles); |
|
&Apache::loncourserespicker::enumerate_course_contents($navmap,\%maps,\%resources,\%titles, |
|
'shorturls',$cdom,$cnum); |
|
my %tocreate; |
|
if (keys(%resources)) { |
|
foreach my $item (sort {$a <=> $b} (@toshorten)) { |
|
my $symb = $resources{$item}; |
|
if ($symb) { |
|
$tocreate{$cnum.'&'.$symb} = 1; |
|
} |
|
} |
|
} |
|
if (keys(%tocreate)) { |
|
my %coursetiny = &Apache::lonnet::dump('tiny',$cdom,$cnum); |
|
my $su = Short::URL->new(no_vowels => 1); |
|
my $init = ''; |
|
my (%newunique,%addcourse,%courseonly,%failed); |
|
# get lock on tiny db |
|
my $now = time; |
|
my $lockhash = { |
|
"lock\0$now" => $env{'user.name'}. |
|
':'.$env{'user.domain'}, |
|
}; |
|
my $tries = 0; |
|
my $gotlock = &Apache::lonnet::newput_dom('tiny',$lockhash,$cdom); |
|
my ($code,$error); |
|
while (($gotlock ne 'ok') && ($tries<3)) { |
|
$tries ++; |
|
sleep 1; |
|
$gotlock = &Apache::lonnet::newput_dom('tiny',$lockhash,$cdom); |
|
} |
|
if ($gotlock eq 'ok') { |
|
$init = &shorten_symbs($cdom,$init,$su,\%coursetiny,\%tocreate,\%newunique, |
|
\%addcourse,\%courseonly,\%failed); |
|
if (keys(%failed)) { |
|
my $numfailed = scalar(keys(%failed)); |
|
push(@errors,&mt('error: could not obtain unique six character URL for [quant,_1,resource]',$numfailed)); |
|
} |
|
if (keys(%newunique)) { |
|
my $putres = &Apache::lonnet::newput_dom('tiny',\%newunique,$cdom); |
|
if ($putres eq 'ok') { |
|
$numnew = scalar(keys(%newunique)); |
|
my $newputres = &Apache::lonnet::newput('tiny',\%addcourse,$cdom,$cnum); |
|
unless ($newputres eq 'ok') { |
|
push(@errors,&mt('error: could not store course look-up of short URLs')); |
|
} |
|
} else { |
|
push(@errors,&mt('error: could not store unique six character URLs')); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return ($numnew,\@errors); |
|
} |
|
|
|
sub shorten_symbs { |
|
my ($cdom,$init,$su,$coursetiny,$tocreate,$newunique,$addcourse,$courseonly,$failed) = @_; |
|
return unless ((ref($su)) && (ref($coursetiny) eq 'HASH') && (ref($tocreate) eq 'HASH') && |
|
(ref($newunique) eq 'HASH') && (ref($addcourse) eq 'HASH') && |
|
(ref($courseonly) eq 'HASH') && (ref($failed) eq 'HASH')); |
|
my (%possibles,%collisions); |
|
foreach my $key (keys(%{$tocreate})) { |
|
my $num = String::CRC32::crc32($key); |
|
my $tiny = $su->encode($num,$init); |
|
if ($tiny) { |
|
$possibles{$tiny} = $key; |
|
} |
|
} |
|
if (!$init) { |
|
$init = 1; |
|
} else { |
|
$init ++; |
|
} |
|
if (keys(%possibles)) { |
|
my @posstiny = keys(%possibles); |
|
my $configuname = &Apache::lonnet::get_domainconfiguser($cdom); |
|
my %currtiny = &Apache::lonnet::get('tiny',\@posstiny,$cdom,$configuname); |
|
if (keys(%currtiny)) { |
|
foreach my $key (keys(%currtiny)) { |
|
next if ($currtiny{$key} eq ''); |
|
if ($currtiny{$key} eq $possibles{$key}) { |
|
my ($tcnum,$tsymb) = split(/\&/,$currtiny{$key}); |
|
unless (($coursetiny->{$tsymb} eq $key) || ($addcourse->{$tsymb} eq $key) || ($courseonly->{$tsymb} eq $key)) { |
|
$courseonly->{$tsymb} = $key; |
|
} |
|
} else { |
|
$collisions{$possibles{$key}} = 1; |
|
} |
|
delete($possibles{$key}); |
|
} |
|
} |
|
foreach my $key (keys(%possibles)) { |
|
$newunique->{$key} = $possibles{$key}; |
|
my ($tcnum,$tsymb) = split(/\&/,$possibles{$key}); |
|
unless (($coursetiny->{$tsymb} eq $key) || ($addcourse->{$tsymb} eq $key) || ($courseonly->{$tsymb} eq $key)) { |
|
$addcourse->{$tsymb} = $key; |
|
} |
|
} |
|
} |
|
if (keys(%collisions)) { |
|
if ($init <5) { |
|
if (!$init) { |
|
$init = 1; |
|
} else { |
|
$init ++; |
|
} |
|
$init = &shorten_symbs($cdom,$init,$su,$coursetiny,\%collisions, |
|
$newunique,$addcourse,$courseonly,$failed); |
|
} else { |
|
foreach my $key (keys(%collisions)) { |
|
$failed->{$key} = 1; |
|
} |
|
} |
|
} |
|
return $init; |
|
} |
|
|
|
1; |
1; |
__END__; |
__END__; |
|
|