version 1.1248, 2016/07/01 19:59:35
|
version 1.1287, 2017/08/07 20:22:13
|
Line 71 use Apache::lonuserutils();
|
Line 71 use Apache::lonuserutils();
|
use Apache::lonuserstate(); |
use Apache::lonuserstate(); |
use Apache::courseclassifier(); |
use Apache::courseclassifier(); |
use LONCAPA qw(:DEFAULT :match); |
use LONCAPA qw(:DEFAULT :match); |
|
use LONCAPA::LWPReq; |
use DateTime::TimeZone; |
use DateTime::TimeZone; |
use DateTime::Locale; |
use DateTime::Locale; |
use Encode(); |
use Encode(); |
Line 267 BEGIN {
|
Line 268 BEGIN {
|
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 943 ENDSCRT
|
Line 944 ENDSCRT
|
} |
} |
|
|
sub select_timezone { |
sub select_timezone { |
my ($name,$selected,$onchange,$includeempty)=@_; |
my ($name,$selected,$onchange,$includeempty,$disabled)=@_; |
my $output='<select name="'.$name.'" '.$onchange.'>'."\n"; |
my $output='<select name="'.$name.'" '.$onchange.$disabled.'>'."\n"; |
if ($includeempty) { |
if ($includeempty) { |
$output .= '<option value=""'; |
$output .= '<option value=""'; |
if (($selected eq '') || ($selected eq 'local')) { |
if (($selected eq '') || ($selected eq 'local')) { |
Line 965 sub select_timezone {
|
Line 966 sub select_timezone {
|
} |
} |
|
|
sub select_datelocale { |
sub select_datelocale { |
my ($name,$selected,$onchange,$includeempty)=@_; |
my ($name,$selected,$onchange,$includeempty,$disabled)=@_; |
my $output='<select name="'.$name.'" '.$onchange.'>'."\n"; |
my $output='<select name="'.$name.'" '.$onchange.$disabled.'>'."\n"; |
if ($includeempty) { |
if ($includeempty) { |
$output .= '<option value=""'; |
$output .= '<option value=""'; |
if ($selected eq '') { |
if ($selected eq '') { |
Line 1018 sub select_datelocale {
|
Line 1019 sub select_datelocale {
|
} |
} |
|
|
sub select_language { |
sub select_language { |
my ($name,$selected,$includeempty) = @_; |
my ($name,$selected,$includeempty,$noedit) = @_; |
my %langchoices; |
my %langchoices; |
if ($includeempty) { |
if ($includeempty) { |
%langchoices = ('' => 'No language preference'); |
%langchoices = ('' => 'No language preference'); |
Line 1030 sub select_language {
|
Line 1031 sub select_language {
|
} |
} |
} |
} |
%langchoices = &Apache::lonlocal::texthash(%langchoices); |
%langchoices = &Apache::lonlocal::texthash(%langchoices); |
return &select_form($selected,$name,\%langchoices); |
return &select_form($selected,$name,\%langchoices,undef,$noedit); |
} |
} |
|
|
=pod |
=pod |
Line 1054 sub list_languages {
|
Line 1055 sub list_languages {
|
if ($code) { |
if ($code) { |
my $selector = $supported_codes{$id}; |
my $selector = $supported_codes{$id}; |
my $description = &plainlanguagedescription($id); |
my $description = &plainlanguagedescription($id); |
push (@lang_choices, [$selector, $description]); |
push(@lang_choices, [$selector, $description]); |
} |
} |
} |
} |
return \@lang_choices; |
return \@lang_choices; |
Line 1176 sub linked_select_forms {
|
Line 1177 sub linked_select_forms {
|
$result.="select2data${suffix}['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"; |
} |
} |
Line 2185 sub crsauthor_url {
|
Line 2186 sub crsauthor_url {
|
} |
} |
|
|
sub import_crsauthor_form { |
sub import_crsauthor_form { |
my ($form,$firstselectname,$secondselectname,$onchangefirst,$only,$suffix) = @_; |
my ($form,$firstselectname,$secondselectname,$onchangefirst,$only,$suffix,$disabled) = @_; |
return (0) unless ($env{'request.course.id'}); |
return (0) unless ($env{'request.course.id'}); |
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
Line 2548 sub multiple_select_form {
|
Line 2549 sub multiple_select_form {
|
|
|
=pod |
=pod |
|
|
=item * &select_form($defdom,$name,$hashref,$onchange) |
=item * &select_form($defdom,$name,$hashref,$onchange,$readonly) |
|
|
Returns a string containing a <select name='$name' size='1'> form to |
Returns a string containing a <select name='$name' size='1'> form to |
allow a user to select options from a ref to a hash containing: |
allow a user to select options from a ref to a hash containing: |
option_name => displayed text. An optional $onchange can include |
option_name => displayed text. An optional $onchange can include |
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 |
|
to be disabled, e.g., for the case where an instructor has a section- |
|
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 2739 sub select_level_form {
|
Line 2743 sub select_level_form {
|
|
|
=pod |
=pod |
|
|
=item * &select_dom_form($defdom,$name,$includeempty,$showdomdesc,$onchange,$incdoms,$excdoms) |
=item * &select_dom_form($defdom,$name,$includeempty,$showdomdesc,$onchange,$incdoms,$excdoms,$disabled) |
|
|
Returns a string containing a <select name='$name' size='1'> form to |
Returns a string containing a <select name='$name' size='1'> form to |
allow a user to select the domain to preform an operation in. |
allow a user to select the domain to preform an operation in. |
Line 2756 The optional $incdoms is a reference to
|
Line 2760 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. |
|
|
=cut |
=cut |
|
|
#------------------------------------------- |
#------------------------------------------- |
sub select_dom_form { |
sub select_dom_form { |
my ($defdom,$name,$includeempty,$showdomdesc,$onchange,$incdoms,$excdoms) = @_; |
my ($defdom,$name,$includeempty,$showdomdesc,$onchange,$incdoms,$excdoms,$disabled) = @_; |
if ($onchange) { |
if ($onchange) { |
$onchange = ' onchange="'.$onchange.'"'; |
$onchange = ' onchange="'.$onchange.'"'; |
} |
} |
|
if ($disabled) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
my (@domains,%exclude); |
my (@domains,%exclude); |
if (ref($incdoms) eq 'ARRAY') { |
if (ref($incdoms) eq 'ARRAY') { |
@domains = sort {lc($a) cmp lc($b)} (@{$incdoms}); |
@domains = sort {lc($a) cmp lc($b)} (@{$incdoms}); |
Line 2774 sub select_dom_form {
|
Line 2783 sub select_dom_form {
|
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>\n"; |
my $selectdomain = "<select name=\"$name\" size=\"1\"$onchange$disabled>\n"; |
foreach my $dom (@domains) { |
foreach my $dom (@domains) { |
next if ($exclude{$dom}); |
next if ($exclude{$dom}); |
$selectdomain.="<option value=\"$dom\" ". |
$selectdomain.="<option value=\"$dom\" ". |
Line 3150 sub authform_kerberos {
|
Line 3159 sub authform_kerberos {
|
@_, |
@_, |
); |
); |
my ($check4,$check5,$krbcheck,$krbarg,$krbver,$result,$authtype, |
my ($check4,$check5,$krbcheck,$krbarg,$krbver,$result,$authtype, |
$autharg,$jscall); |
$autharg,$jscall,$disabled); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
if ($in{'kerb_def_auth'} eq 'krb5') { |
if ($in{'kerb_def_auth'} eq 'krb5') { |
$check5 = ' checked="checked"'; |
$check5 = ' checked="checked"'; |
} else { |
} else { |
$check4 = ' checked="checked"'; |
$check4 = ' checked="checked"'; |
} |
} |
|
if ($in{'readonly'}) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
$krbarg = $in{'kerb_def_dom'}; |
$krbarg = $in{'kerb_def_dom'}; |
if (defined($in{'curr_authtype'})) { |
if (defined($in{'curr_authtype'})) { |
if ($in{'curr_authtype'} eq 'krb') { |
if ($in{'curr_authtype'} eq 'krb') { |
Line 3201 sub authform_kerberos {
|
Line 3213 sub authform_kerberos {
|
if (defined($in{'mode'})) { |
if (defined($in{'mode'})) { |
if ($in{'mode'} eq 'modifycourse') { |
if ($in{'mode'} eq 'modifycourse') { |
if ($authnum == 1) { |
if ($authnum == 1) { |
$authtype = '<input type="radio" name="login" value="krb" />'; |
$authtype = '<input type="radio" name="login" value="krb"'.$disabled.' />'; |
} |
} |
} |
} |
} |
} |
Line 3210 sub authform_kerberos {
|
Line 3222 sub authform_kerberos {
|
if ($authtype eq '') { |
if ($authtype eq '') { |
$authtype = '<input type="radio" name="login" value="krb" '. |
$authtype = '<input type="radio" name="login" value="krb" '. |
'onclick="'.$jscall.'" onchange="'.$jscall.'"'. |
'onclick="'.$jscall.'" onchange="'.$jscall.'"'. |
$krbcheck.' />'; |
$krbcheck.$disabled.' />'; |
} |
} |
if (($can_assign{'krb4'} && $can_assign{'krb5'}) || |
if (($can_assign{'krb4'} && $can_assign{'krb5'}) || |
($can_assign{'krb4'} && !$can_assign{'krb5'} && |
($can_assign{'krb4'} && !$can_assign{'krb5'} && |
Line 3223 sub authform_kerberos {
|
Line 3235 sub authform_kerberos {
|
'<label>'.$authtype, |
'<label>'.$authtype, |
'</label><input type="text" size="10" name="krbarg" '. |
'</label><input type="text" size="10" name="krbarg" '. |
'value="'.$krbarg.'" '. |
'value="'.$krbarg.'" '. |
'onchange="'.$jscall.'" />', |
'onchange="'.$jscall.'"'.$disabled.' />', |
'<label><input type="radio" name="krbver" value="4" '.$check4.' />', |
'<label><input type="radio" name="krbver" value="4" '.$check4.$disabled.' />', |
'</label><label><input type="radio" name="krbver" value="5" '.$check5.' />', |
'</label><label><input type="radio" name="krbver" value="5" '.$check5.$disabled.' />', |
'</label>'); |
'</label>'); |
} elsif ($can_assign{'krb4'}) { |
} elsif ($can_assign{'krb4'}) { |
$result .= &mt |
$result .= &mt |
Line 3234 sub authform_kerberos {
|
Line 3246 sub authform_kerberos {
|
'<label>'.$authtype, |
'<label>'.$authtype, |
'</label><input type="text" size="10" name="krbarg" '. |
'</label><input type="text" size="10" name="krbarg" '. |
'value="'.$krbarg.'" '. |
'value="'.$krbarg.'" '. |
'onchange="'.$jscall.'" />', |
'onchange="'.$jscall.'"'.$disabled.' />', |
'<label><input type="hidden" name="krbver" value="4" />', |
'<label><input type="hidden" name="krbver" value="4" />', |
'</label>'); |
'</label>'); |
} elsif ($can_assign{'krb5'}) { |
} elsif ($can_assign{'krb5'}) { |
Line 3244 sub authform_kerberos {
|
Line 3256 sub authform_kerberos {
|
'<label>'.$authtype, |
'<label>'.$authtype, |
'</label><input type="text" size="10" name="krbarg" '. |
'</label><input type="text" size="10" name="krbarg" '. |
'value="'.$krbarg.'" '. |
'value="'.$krbarg.'" '. |
'onchange="'.$jscall.'" />', |
'onchange="'.$jscall.'"'.$disabled.' />', |
'<label><input type="hidden" name="krbver" value="5" />', |
'<label><input type="hidden" name="krbver" value="5" />', |
'</label>'); |
'</label>'); |
} |
} |
Line 3257 sub authform_internal {
|
Line 3269 sub authform_internal {
|
kerb_def_dom => 'MSU.EDU', |
kerb_def_dom => 'MSU.EDU', |
@_, |
@_, |
); |
); |
my ($intcheck,$intarg,$result,$authtype,$autharg,$jscall); |
my ($intcheck,$intarg,$result,$authtype,$autharg,$jscall,$disabled); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
|
if ($in{'readonly'}) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
if (defined($in{'curr_authtype'})) { |
if (defined($in{'curr_authtype'})) { |
if ($in{'curr_authtype'} eq 'int') { |
if ($in{'curr_authtype'} eq 'int') { |
if ($can_assign{'int'}) { |
if ($can_assign{'int'}) { |
Line 3287 sub authform_internal {
|
Line 3302 sub authform_internal {
|
if (defined($in{'mode'})) { |
if (defined($in{'mode'})) { |
if ($in{'mode'} eq 'modifycourse') { |
if ($in{'mode'} eq 'modifycourse') { |
if ($authnum == 1) { |
if ($authnum == 1) { |
$authtype = '<input type="radio" name="login" value="int" />'; |
$authtype = '<input type="radio" name="login" value="int"'.$disabled.' />'; |
} |
} |
} |
} |
} |
} |
Line 3295 sub authform_internal {
|
Line 3310 sub authform_internal {
|
$jscall = "javascript:changed_radio('int',$in{'formname'});"; |
$jscall = "javascript:changed_radio('int',$in{'formname'});"; |
if ($authtype eq '') { |
if ($authtype eq '') { |
$authtype = '<input type="radio" name="login" value="int" '.$intcheck. |
$authtype = '<input type="radio" name="login" value="int" '.$intcheck. |
' onchange="'.$jscall.'" onclick="'.$jscall.'" />'; |
' onchange="'.$jscall.'" onclick="'.$jscall.'"'.$disabled.' />'; |
} |
} |
$autharg = '<input type="password" size="10" name="intarg" value="'. |
$autharg = '<input type="password" size="10" name="intarg" value="'. |
$intarg.'" onchange="'.$jscall.'" />'; |
$intarg.'" onchange="'.$jscall.'"'.$disabled.' />'; |
$result = &mt |
$result = &mt |
('[_1] Internally authenticated (with initial password [_2])', |
('[_1] Internally authenticated (with initial password [_2])', |
'<label>'.$authtype,'</label>'.$autharg); |
'<label>'.$authtype,'</label>'.$autharg); |
$result.="<label><input type=\"checkbox\" name=\"visible\" onclick='if (this.checked) { this.form.intarg.type=\"text\" } else { this.form.intarg.type=\"password\" }' />".&mt('Visible input').'</label>'; |
$result.='<label><input type="checkbox" name="visible" onclick="if (this.checked) { this.form.intarg.type='."'text'".' } else { this.form.intarg.type='."'password'".' }"'.$disabled.' />'.&mt('Visible input').'</label>'; |
return $result; |
return $result; |
} |
} |
|
|
Line 3312 sub authform_local {
|
Line 3327 sub authform_local {
|
kerb_def_dom => 'MSU.EDU', |
kerb_def_dom => 'MSU.EDU', |
@_, |
@_, |
); |
); |
my ($loccheck,$locarg,$result,$authtype,$autharg,$jscall); |
my ($loccheck,$locarg,$result,$authtype,$autharg,$jscall,$disabled); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
|
if ($in{'readonly'}) { |
|
$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 3342 sub authform_local {
|
Line 3360 sub authform_local {
|
if (defined($in{'mode'})) { |
if (defined($in{'mode'})) { |
if ($in{'mode'} eq 'modifycourse') { |
if ($in{'mode'} eq 'modifycourse') { |
if ($authnum == 1) { |
if ($authnum == 1) { |
$authtype = '<input type="radio" name="login" value="loc" />'; |
$authtype = '<input type="radio" name="login" value="loc"'.$disabled.' />'; |
} |
} |
} |
} |
} |
} |
Line 3351 sub authform_local {
|
Line 3369 sub authform_local {
|
if ($authtype eq '') { |
if ($authtype eq '') { |
$authtype = '<input type="radio" name="login" value="loc" '. |
$authtype = '<input type="radio" name="login" value="loc" '. |
$loccheck.' onchange="'.$jscall.'" onclick="'. |
$loccheck.' onchange="'.$jscall.'" onclick="'. |
$jscall.'" />'; |
$jscall.'"'.$disabled.' />'; |
} |
} |
$autharg = '<input type="text" size="10" name="locarg" value="'. |
$autharg = '<input type="text" size="10" name="locarg" value="'. |
$locarg.'" onchange="'.$jscall.'" />'; |
$locarg.'" onchange="'.$jscall.'"'.$disabled.' />'; |
$result = &mt('[_1] Local Authentication with argument [_2]', |
$result = &mt('[_1] Local Authentication with argument [_2]', |
'<label>'.$authtype,'</label>'.$autharg); |
'<label>'.$authtype,'</label>'.$autharg); |
return $result; |
return $result; |
Line 3366 sub authform_filesystem {
|
Line 3384 sub authform_filesystem {
|
kerb_def_dom => 'MSU.EDU', |
kerb_def_dom => 'MSU.EDU', |
@_, |
@_, |
); |
); |
my ($fsyscheck,$result,$authtype,$autharg,$jscall); |
my ($fsyscheck,$result,$authtype,$autharg,$jscall,$disabled); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
|
if ($in{'readonly'}) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
if (defined($in{'curr_authtype'})) { |
if (defined($in{'curr_authtype'})) { |
if ($in{'curr_authtype'} eq 'fsys') { |
if ($in{'curr_authtype'} eq 'fsys') { |
if ($can_assign{'fsys'}) { |
if ($can_assign{'fsys'}) { |
Line 3380 sub authform_filesystem {
|
Line 3401 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 3393 sub authform_filesystem {
|
Line 3414 sub authform_filesystem {
|
if (defined($in{'mode'})) { |
if (defined($in{'mode'})) { |
if ($in{'mode'} eq 'modifycourse') { |
if ($in{'mode'} eq 'modifycourse') { |
if ($authnum == 1) { |
if ($authnum == 1) { |
$authtype = '<input type="radio" name="login" value="fsys" />'; |
$authtype = '<input type="radio" name="login" value="fsys"'.$disabled.' />'; |
} |
} |
} |
} |
} |
} |
Line 3402 sub authform_filesystem {
|
Line 3423 sub authform_filesystem {
|
if ($authtype eq '') { |
if ($authtype eq '') { |
$authtype = '<input type="radio" name="login" value="fsys" '. |
$authtype = '<input type="radio" name="login" value="fsys" '. |
$fsyscheck.' onchange="'.$jscall.'" onclick="'. |
$fsyscheck.' onchange="'.$jscall.'" onclick="'. |
$jscall.'" />'; |
$jscall.'"'.$disabled.' />'; |
} |
} |
$autharg = '<input type="text" size="10" name="fsysarg" value=""'. |
$autharg = '<input type="text" size="10" name="fsysarg" value=""'. |
' onchange="'.$jscall.'" />'; |
' onchange="'.$jscall.'"'.$disabled.' />'; |
$result = &mt |
$result = &mt |
('[_1] Filesystem Authenticated (with initial password [_2])', |
('[_1] Filesystem Authenticated (with initial password [_2])', |
'<label><input type="radio" name="login" value="fsys" '. |
'<label><input type="radio" name="login" value="fsys" '. |
$fsyscheck.'onchange="'.$jscall.'" onclick="'.$jscall.'" />', |
$fsyscheck.'onchange="'.$jscall.'" onclick="'.$jscall.'"'.$disabled.' />', |
'</label><input type="password" size="10" name="fsysarg" value="" '. |
'</label><input type="password" size="10" name="fsysarg" value="" '. |
'onchange="'.$jscall.'" />'); |
'onchange="'.$jscall.'"'.$disabled.' />'); |
return $result; |
return $result; |
} |
} |
|
|
Line 3433 sub get_assignable_auth {
|
Line 3454 sub get_assignable_auth {
|
my $context; |
my $context; |
if ($env{'request.role'} =~ /^au/) { |
if ($env{'request.role'} =~ /^au/) { |
$context = 'author'; |
$context = 'author'; |
} elsif ($env{'request.role'} =~ /^dc/) { |
} elsif ($env{'request.role'} =~ /^(dc|dh)/) { |
$context = 'domain'; |
$context = 'domain'; |
} elsif ($env{'request.course.id'}) { |
} elsif ($env{'request.course.id'}) { |
$context = 'course'; |
$context = 'course'; |
Line 4971 sub blockcheck {
|
Line 4992 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 5055 sub blockcheck {
|
Line 5077 sub blockcheck {
|
$tdom,$spec,$trest,$area); |
$tdom,$spec,$trest,$area); |
} |
} |
} |
} |
my ($author,$adv) = &Apache::lonnet::set_userprivs(\%userroles,\%allroles); |
my ($author,$adv,$rar) = &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 5079 sub blockcheck {
|
Line 5101 sub blockcheck {
|
|
|
# Retrieve blocking times and identity of locker for course |
# Retrieve blocking times and identity of locker for course |
# of specified user, unless user has 'evb' privilege. |
# of specified user, unless user has 'evb' privilege. |
|
|
my ($start,$end,$trigger) = |
my ($start,$end,$trigger) = |
&get_blocks($setters,$activity,$cdom,$cnum,$url); |
&get_blocks($setters,$activity,$cdom,$cnum,$url); |
if (($start != 0) && |
if (($start != 0) && |
Line 5166 sub get_blocks {
|
Line 5188 sub get_blocks {
|
my $end = $start + $env{'course.'.$cdom.'_'.$cnum.'.timerinterval.'.$timersymb}; |
my $end = $start + $env{'course.'.$cdom.'_'.$cnum.'.timerinterval.'.$timersymb}; |
if ($start && $end) { |
if ($start && $end) { |
if (($start <= time) && ($end >= time)) { |
if (($start <= time) && ($end >= time)) { |
unless (grep(/^\Q$block\E$/,@blockers)) { |
if (ref($commblocks{$block}) eq 'HASH') { |
push(@blockers,$block); |
if (ref($commblocks{$block}{'blocks'}) eq 'HASH') { |
$triggered{$block} = { |
if ($commblocks{$block}{'blocks'}{$activity} eq 'on') { |
start => $start, |
unless(grep(/^\Q$block\E$/,@blockers)) { |
end => $end, |
push(@blockers,$block); |
type => $type, |
$triggered{$block} = { |
}; |
start => $start, |
|
end => $end, |
|
type => $type, |
|
}; |
|
} |
|
} |
|
} |
} |
} |
} |
} |
} |
} |
Line 5282 END_MYBLOCK
|
Line 5310 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 5306 sub check_ip_acc {
|
Line 5338 sub check_ip_acc {
|
return 1; |
return 1; |
} |
} |
my $allowed; |
my $allowed; |
my $ip=$env{'request.host'} || $ENV{'REMOTE_ADDR'} || $clientip; |
my $ip=$ENV{'REMOTE_ADDR'} || $clientip || $env{'request.host'}; |
|
|
my $name; |
my $name; |
my %access = ( |
my %access = ( |
Line 5789 Inputs:
|
Line 5821 Inputs:
|
|
|
=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 |
|
use_absolute -> for external resource or syllabus, this will |
|
contain https://<hostname> if server uses |
|
https (as per hosts.tab), but request is for http |
|
hostname -> hostname, from $r->hostname(). |
|
|
=item * $advtoolsref, optional argument, ref to an array containing |
=item * $advtoolsref, optional argument, ref to an array containing |
inlineremote items to be added in "Functions" menu below |
inlineremote items to be added in "Functions" menu below |
Line 5814 sub bodytag {
|
Line 5850 sub bodytag {
|
} |
} |
if (!$args->{'no_auto_mt_title'}) { $title = &mt($title); } |
if (!$args->{'no_auto_mt_title'}) { $title = &mt($title); } |
my $httphost = $args->{'use_absolute'}; |
my $httphost = $args->{'use_absolute'}; |
|
my $hostname = $args->{'hostname'}; |
|
|
$function = &get_users_function() if (!$function); |
$function = &get_users_function() if (!$function); |
my $img = &designparm($function.'.img',$domain); |
my $img = &designparm($function.'.img',$domain); |
Line 5841 sub bodytag {
|
Line 5878 sub bodytag {
|
if ($env{'request.course.id'}) { |
if ($env{'request.course.id'}) { |
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+)$}) { |
|
if ($env{'request.role.desc'}) { |
|
$role = $env{'request.role.desc'}; |
|
} else { |
|
$role = &mt('Helpdesk[_1]',' '.$2); |
|
} |
|
} else { |
|
$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 5934 sub bodytag {
|
Line 5979 sub bodytag {
|
$bodytag .= Apache::lonhtmlcommon::scripttag('', 'end'); |
$bodytag .= Apache::lonhtmlcommon::scripttag('', 'end'); |
if ($env{'request.state'} eq 'construct') { |
if ($env{'request.state'} eq 'construct') { |
$bodytag .= &Apache::lonmenu::innerregister($forcereg, |
$bodytag .= &Apache::lonmenu::innerregister($forcereg, |
$args->{'bread_crumbs'}); |
$args->{'bread_crumbs'},'','',$hostname); |
} elsif ($forcereg) { |
} elsif ($forcereg) { |
$bodytag .= &Apache::lonmenu::innerregister($forcereg,undef, |
$bodytag .= &Apache::lonmenu::innerregister($forcereg,undef, |
$args->{'group'}); |
$args->{'group'}, |
|
$args->{'hide_buttons'}, |
|
$hostname); |
} else { |
} else { |
$bodytag .= |
$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); |
$advtoolsref,'',$hostname); |
} |
} |
}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 6405 td.LC_menubuttons_text {
|
Line 6452 td.LC_menubuttons_text {
|
background: $tabbg; |
background: $tabbg; |
} |
} |
|
|
|
td.LC_zero_height { |
|
line-height: 0; |
|
cellpadding: 0; |
|
} |
|
|
table.LC_data_table { |
table.LC_data_table { |
border: 1px solid #000000; |
border: 1px solid #000000; |
border-collapse: separate; |
border-collapse: separate; |
Line 6726 td.LC_parm_overview_restrictions {
|
Line 6778 td.LC_parm_overview_restrictions {
|
border-collapse: collapse; |
border-collapse: collapse; |
} |
} |
|
|
|
span.LC_parm_recursive, |
|
td.LC_parm_recursive { |
|
font-weight: bold; |
|
font-size: smaller; |
|
} |
|
|
table.LC_parm_overview_restrictions td { |
table.LC_parm_overview_restrictions td { |
border-width: 1px 4px 1px 4px; |
border-width: 1px 4px 1px 4px; |
border-style: solid; |
border-style: solid; |
Line 7077 table.LC_data_table tr > td.LC_docs_entr
|
Line 7135 table.LC_data_table tr > td.LC_docs_entr
|
color: #990000; |
color: #990000; |
} |
} |
|
|
|
.LC_docs_alias { |
|
color: #440055; |
|
} |
|
|
|
.LC_domprefs_email, |
|
.LC_docs_alias_name, |
.LC_docs_reinit_warn, |
.LC_docs_reinit_warn, |
.LC_docs_ext_edit { |
.LC_docs_ext_edit { |
font-size: x-small; |
font-size: x-small; |
Line 8097 section.role-warning>h1:before {
|
Line 8161 section.role-warning>h1:before {
|
content:url('/adm/daxe/images/section_icons/warning.png'); |
content:url('/adm/daxe/images/section_icons/warning.png'); |
} |
} |
|
|
|
#LC_minitab_header { |
|
float:left; |
|
width:100%; |
|
background:#DAE0D2 url("/res/adm/pages/minitabmenu_bg.gif") repeat-x bottom; |
|
font-size:93%; |
|
line-height:normal; |
|
margin: 0.5em 0 0.5em 0; |
|
} |
|
#LC_minitab_header ul { |
|
margin:0; |
|
padding:10px 10px 0; |
|
list-style:none; |
|
} |
|
#LC_minitab_header li { |
|
float:left; |
|
background:url("/res/adm/pages/minitabmenu_left.gif") no-repeat left top; |
|
margin:0; |
|
padding:0 0 0 9px; |
|
} |
|
#LC_minitab_header a { |
|
display:block; |
|
background:url("/res/adm/pages/minitabmenu_right.gif") no-repeat right top; |
|
padding:5px 15px 4px 6px; |
|
} |
|
#LC_minitab_header #LC_current_minitab { |
|
background-image:url("/res/adm/pages/minitabmenu_left_on.gif"); |
|
} |
|
#LC_minitab_header #LC_current_minitab a { |
|
background-image:url("/res/adm/pages/minitabmenu_right_on.gif"); |
|
padding-bottom:5px; |
|
} |
|
|
|
|
END |
END |
} |
} |
|
|
Line 8289 OFFLOAD
|
Line 8386 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 8468 $args - additional optional args support
|
Line 8566 $args - additional optional args support
|
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 |
|
to lonhtmlcommon::breadcrumbs |
group -> includes the current group, if page is for a |
group -> includes the current group, if page is for a |
specific group |
specific group |
|
use_absolute -> for request for external resource or syllabus, this |
|
will contain https://<hostname> if server uses |
|
https (as per hosts.tab), but request is for http |
|
hostname -> hostname, originally from $r->hostname(), (optional). |
|
|
=back |
=back |
|
|
Line 8533 sub start_page {
|
Line 8637 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'})) || |
|
((($args->{'crstype'} eq 'Placement') || (($env{'request.course.id'}) && |
|
($env{'course.'.$env{'request.course.id'}.'.type'} eq 'Placement'))) && |
|
(!$env{'request.role.adv'}))) { |
|
$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'}); |
$result .= &Apache::lonhtmlcommon::breadcrumbs($args->{'bread_crumbs_component'},'',$menulink); |
} elsif ($args->{'crstype'} eq 'Placement') { |
|
$result .= &Apache::lonhtmlcommon::breadcrumbs('','','','','','','','','', |
|
$args->{'crstype'}); |
|
} else { |
} else { |
$result .= &Apache::lonhtmlcommon::breadcrumbs(); |
$result .= &Apache::lonhtmlcommon::breadcrumbs('','',$menulink); |
} |
} |
} |
} |
return $result; |
return $result; |
Line 8638 var modalWindow = {
|
Line 8748 var modalWindow = {
|
}; |
}; |
var openMyModal = function(source,width,height,scrolling,transparency,style) |
var openMyModal = function(source,width,height,scrolling,transparency,style) |
{ |
{ |
source = source.replace("'","'"); |
source = source.replace(/'/g,"'"); |
modalWindow.windowId = "myModal"; |
modalWindow.windowId = "myModal"; |
modalWindow.width = width; |
modalWindow.width = width; |
modalWindow.height = height; |
modalWindow.height = height; |
Line 9957 sub get_secgrprole_info {
|
Line 10067 sub get_secgrprole_info {
|
} |
} |
|
|
sub user_picker { |
sub user_picker { |
my ($dom,$srch,$forcenewuser,$caller,$cancreate,$usertype,$context) = @_; |
my ($dom,$srch,$forcenewuser,$caller,$cancreate,$usertype,$context,$fixeddom,$noinstd) = @_; |
my $currdom = $dom; |
my $currdom = $dom; |
|
my @alldoms = &Apache::lonnet::all_domains(); |
|
if (@alldoms == 1) { |
|
my %domsrch = &Apache::lonnet::get_dom('configuration', |
|
['directorysrch'],$alldoms[0]); |
|
my $domdesc = &Apache::lonnet::domain($alldoms[0],'description'); |
|
my $showdom = $domdesc; |
|
if ($showdom eq '') { |
|
$showdom = $dom; |
|
} |
|
if (ref($domsrch{'directorysrch'}) eq 'HASH') { |
|
if ((!$domsrch{'directorysrch'}{'available'}) && |
|
($domsrch{'directorysrch'}{'lcavailable'} eq '0')) { |
|
return (&mt('LON-CAPA directory search is not available in domain: [_1]',$showdom),0); |
|
} |
|
} |
|
} |
my %curr_selected = ( |
my %curr_selected = ( |
srchin => 'dom', |
srchin => 'dom', |
srchby => 'lastname', |
srchby => 'lastname', |
Line 10005 sub user_picker {
|
Line 10131 sub user_picker {
|
); |
); |
&html_escape(\%html_lt); |
&html_escape(\%html_lt); |
&js_escape(\%js_lt); |
&js_escape(\%js_lt); |
my $domform = &select_dom_form($currdom,'srchdomain',1,1); |
my $domform; |
|
my $allow_blank = 1; |
|
if ($fixeddom) { |
|
$allow_blank = 0; |
|
$domform = &select_dom_form($currdom,'srchdomain',$allow_blank,1,undef,[$currdom]); |
|
} else { |
|
my $defdom = $env{'request.role.domain'}; |
|
my ($trustedref,$untrustedref); |
|
if (($context eq 'requestcrs') || ($context eq 'course')) { |
|
($trustedref,$untrustedref) = &Apache::lonnet::trusted_domains('enroll',$defdom); |
|
} elsif ($context eq 'author') { |
|
($trustedref,$untrustedref) = &Apache::lonnet::trusted_domains('othcoau',$defdom); |
|
} elsif ($context eq 'domain') { |
|
($trustedref,$untrustedref) = &Apache::lonnet::trusted_domains('domroles',$defdom); |
|
} |
|
$domform = &select_dom_form($currdom,'srchdomain',$allow_blank,1,undef,$trustedref,$untrustedref); |
|
} |
my $srchinsel = ' <select name="srchin">'; |
my $srchinsel = ' <select name="srchin">'; |
|
|
my @srchins = ('crs','dom','alc','instd'); |
my @srchins = ('crs','dom','alc','instd'); |
Line 10017 sub user_picker {
|
Line 10159 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 10199 END_BLOCK
|
Line 10342 END_BLOCK
|
&Apache::lonhtmlcommon::row_closure(1). |
&Apache::lonhtmlcommon::row_closure(1). |
&Apache::lonhtmlcommon::end_pick_box(). |
&Apache::lonhtmlcommon::end_pick_box(). |
'<br />'; |
'<br />'; |
return $output; |
return ($output,1); |
} |
} |
|
|
sub user_rule_check { |
sub user_rule_check { |
Line 10514 sub get_institutional_codes {
|
Line 10657 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 10527 sub get_institutional_codes {
|
Line 10670 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 10625 reservable_now - ref to hash of student_
|
Line 10768 reservable_now - ref to hash of student_
|
|
|
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) endreserve: end date of reservation period. |
(b) endreserve: end date of reservation period. |
|
(c) uniqueperiod: start,end dates when slot is to be uniquely |
|
selected. |
|
|
sorted_future - ref to array of student_schedulable slots reservable in |
sorted_future - ref to array of student_schedulable slots reservable in |
the future, ordered by start date of reservation period. |
the future, ordered by start date of reservation period. |
Line 10635 future_reservable - ref to hash of stude
|
Line 10780 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 |
|
selected. |
|
|
=back |
=back |
|
|
Line 10711 sub get_future_slots {
|
Line 10858 sub get_future_slots {
|
my $startreserve = $slots{$slot}->{'startreserve'}; |
my $startreserve = $slots{$slot}->{'startreserve'}; |
my $endreserve = $slots{$slot}->{'endreserve'}; |
my $endreserve = $slots{$slot}->{'endreserve'}; |
my $symb = $slots{$slot}->{'symb'}; |
my $symb = $slots{$slot}->{'symb'}; |
|
my $uniqueperiod; |
|
if (ref($slots{$slot}->{'uniqueperiod'}) eq 'ARRAY') { |
|
$uniqueperiod = join(',',@{$slots{$slot}->{'uniqueperiod'}}); |
|
} |
if (($startreserve < $now) && |
if (($startreserve < $now) && |
(!$endreserve || $endreserve > $now)) { |
(!$endreserve || $endreserve > $now)) { |
my $lastres = $endreserve; |
my $lastres = $endreserve; |
Line 10719 sub get_future_slots {
|
Line 10870 sub get_future_slots {
|
} |
} |
$reservable_now{$slot} = { |
$reservable_now{$slot} = { |
symb => $symb, |
symb => $symb, |
endreserve => $lastres |
endreserve => $lastres, |
|
uniqueperiod => $uniqueperiod, |
}; |
}; |
} elsif (($startreserve > $now) && |
} elsif (($startreserve > $now) && |
(!$endreserve || $endreserve > $startreserve)) { |
(!$endreserve || $endreserve > $startreserve)) { |
$future_reservable{$slot} = { |
$future_reservable{$slot} = { |
symb => $symb, |
symb => $symb, |
startreserve => $startreserve |
startreserve => $startreserve, |
|
uniqueperiod => $uniqueperiod, |
}; |
}; |
} |
} |
} |
} |
Line 10883 sub get_env_multiple {
|
Line 11036 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 10899 sub ask_for_embedded_content {
|
Line 11068 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 10983 sub ask_for_embedded_content {
|
Line 11155 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 11025 sub ask_for_embedded_content {
|
Line 11207 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} = {}; |
Line 11100 sub ask_for_embedded_content {
|
Line 11295 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 11138 sub ask_for_embedded_content {
|
Line 11336 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 11166 sub ask_for_embedded_content {
|
Line 11366 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)); |
Line 11177 sub ask_for_embedded_content {
|
Line 11379 sub ask_for_embedded_content {
|
$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 13910 sub DrawBarGraph {
|
Line 14118 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 14369 Returns: comma separated list of address
|
Line 14577 Returns: comma separated list of address
|
sub build_recipient_list { |
sub build_recipient_list { |
my ($defmail,$mailing,$defdom,$origmail) = @_; |
my ($defmail,$mailing,$defdom,$origmail) = @_; |
my @recipients; |
my @recipients; |
my $otheremails; |
my ($otheremails,$lastresort,$allbcc,$addtext); |
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 14383 sub build_recipient_list {
|
Line 14591 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 '') { |
push(@recipients,$origmail); |
$lastresort = $origmail; |
} |
} |
} elsif ($origmail ne '') { |
} elsif ($origmail ne '') { |
push(@recipients,$origmail); |
$lastresort = $origmail; |
|
} |
|
|
|
if (($mailing eq 'helpdesk') && ($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 14410 sub build_recipient_list {
|
Line 14700 sub build_recipient_list {
|
} |
} |
} |
} |
} |
} |
my $recipientlist = join(',',@recipients); |
if ($mailing eq 'helpdesk') { |
return $recipientlist; |
if ((!@recipients) && ($lastresort ne '')) { |
|
push(@recipients,$lastresort); |
|
} |
|
} elsif ($lastresort ne '') { |
|
if (!grep(/^\Q$lastresort\E$/,@recipients)) { |
|
push(@recipients,$lastresort); |
|
} |
|
} |
|
my $recipientlist = join(',',@recipients); |
|
if (wantarray) { |
|
return ($recipientlist,$allbcc,$addtext); |
|
} else { |
|
return $recipientlist; |
|
} |
} |
} |
|
|
############################################################ |
############################################################ |
Line 14718 currcat - scalar with an & separated lis
|
Line 15021 currcat - scalar with an & separated lis
|
|
|
type - scalar contains course type (Course or Community). |
type - scalar contains course type (Course or Community). |
|
|
|
disabled - scalar (optional) contains disabled="disabled" if input elements are |
|
to be readonly (e.g., Domain Helpdesk role viewing course settings). |
|
|
Returns: $output (markup to be displayed) |
Returns: $output (markup to be displayed) |
|
|
=cut |
=cut |
|
|
sub assign_categories_table { |
sub assign_categories_table { |
my ($cathash,$currcat,$type) = @_; |
my ($cathash,$currcat,$type,$disabled) = @_; |
my $output; |
my $output; |
if (ref($cathash) eq 'HASH') { |
if (ref($cathash) eq 'HASH') { |
my (@cats,@trails,%allitems,%idx,@jsarray,@path,$maxdepth); |
my (@cats,@trails,%allitems,%idx,@jsarray,@path,$maxdepth); |
Line 14763 sub assign_categories_table {
|
Line 15069 sub assign_categories_table {
|
} |
} |
$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="'. |
$item.'"'.$checked.' />'.$parent_title.'</span>'. |
$item.'"'.$checked.$disabled.' />'.$parent_title.'</span>'. |
'<input type="hidden" name="catname" value="'.$parent.'" /></td>'; |
'<input type="hidden" name="catname" value="'.$parent.'" /></td>'; |
my $depth = 1; |
my $depth = 1; |
push(@path,$parent); |
push(@path,$parent); |
$table .= &assign_category_rows($itemcount,\@cats,$depth,$parent,\@path,\@currcategories); |
$table .= &assign_category_rows($itemcount,\@cats,$depth,$parent,\@path,\@currcategories,$disabled); |
pop(@path); |
pop(@path); |
$table .= '</tr><tr><td colspan="'.$maxdepth.'" class="LC_row_separator"></td></tr>'; |
$table .= '</tr><tr><td colspan="'.$maxdepth.'" class="LC_row_separator"></td></tr>'; |
$itemcount ++; |
$itemcount ++; |
Line 14806 path - Array containing all categories b
|
Line 15112 path - Array containing all categories b
|
|
|
currcategories - reference to array of current categories assigned to the course |
currcategories - reference to array of current categories assigned to the course |
|
|
|
disabled - scalar (optional) contains disabled="disabled" if input elements are |
|
to be readonly (e.g., Domain Helpdesk role viewing course settings). |
|
|
Returns: $output (markup to be displayed). |
Returns: $output (markup to be displayed). |
|
|
=cut |
=cut |
|
|
sub assign_category_rows { |
sub assign_category_rows { |
my ($itemcount,$cats,$depth,$parent,$path,$currcategories) = @_; |
my ($itemcount,$cats,$depth,$parent,$path,$currcategories,$disabled) = @_; |
my ($text,$name,$item,$chgstr); |
my ($text,$name,$item,$chgstr); |
if (ref($cats) eq 'ARRAY') { |
if (ref($cats) eq 'ARRAY') { |
my $maxdepth = scalar(@{$cats}); |
my $maxdepth = scalar(@{$cats}); |
Line 14834 sub assign_category_rows {
|
Line 15143 sub assign_category_rows {
|
} |
} |
$text .= '<tr><td><span class="LC_nobreak"><label>'. |
$text .= '<tr><td><span class="LC_nobreak"><label>'. |
'<input type="checkbox" name="usecategory" value="'. |
'<input type="checkbox" name="usecategory" value="'. |
$item.'"'.$checked.' />'.$name.'</label></span>'. |
$item.'"'.$checked.$disabled.' />'.$name.'</label></span>'. |
'<input type="hidden" name="catname" value="'.$name.'" />'. |
'<input type="hidden" name="catname" value="'.$name.'" />'. |
'</td><td>'; |
'</td><td>'; |
if (ref($path) eq 'ARRAY') { |
if (ref($path) eq 'ARRAY') { |
push(@{$path},$name); |
push(@{$path},$name); |
$text .= &assign_category_rows($itemcount,$cats,$deeper,$name,$path,$currcategories); |
$text .= &assign_category_rows($itemcount,$cats,$deeper,$name,$path,$currcategories,$disabled); |
pop(@{$path}); |
pop(@{$path}); |
} |
} |
$text .= '</td></tr>'; |
$text .= '</td></tr>'; |
Line 15066 sub check_clone {
|
Line 15375 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); |
} |
} |
} |
} |
if (($env{'request.role.domain'} eq $args->{'clonedomain'}) && |
if (($env{'request.role.domain'} eq $args->{'clonedomain'}) && |
(&Apache::lonnet::allowed('ccc',$env{'request.role.domain'}))) { |
(&Apache::lonnet::allowed('ccc',$env{'request.role.domain'}))) { |
$can_clone = 1; |
$can_clone = 1; |
} else { |
} else { |
Line 15167 sub check_clone {
|
Line 15476 sub check_clone {
|
} |
} |
|
|
sub construct_course { |
sub construct_course { |
my ($args,$logmsg,$courseid,$crsudom,$crsunum,$udom,$uname,$context,$cnum,$category,$coderef) = @_; |
my ($args,$logmsg,$courseid,$crsudom,$crsunum,$udom,$uname,$context, |
|
$cnum,$category,$coderef) = @_; |
my $outcome; |
my $outcome; |
my $linefeed = '<br />'."\n"; |
my $linefeed = '<br />'."\n"; |
if ($context eq 'auto') { |
if ($context eq 'auto') { |
Line 15320 sub construct_course {
|
Line 15630 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 15348 sub construct_course {
|
Line 15658 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 15383 sub construct_course {
|
Line 15693 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. 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', |
'tclb' => 'The courses listed below were included as sections or crosslistings affiliated with your new LON-CAPA course.', |
'dnhr' => 'does not have rights to access enrollment in these classes', |
'howi' => 'However, if automated course roster updates are enabled for this class, these particular sections/crosslistings are not guaranteed to contribute towards enrollment.', |
'adby' => 'as determined by the policies of your institution on access to official classlists' |
'itis' => 'It is possible that rights to access enrollment for these classes will be available through assignment of co-owners.', |
); |
); |
my $badclass_msg = $cenv{'internal.courseowner'}.') - '.$lt{'dnhr'}. |
my $badclass_msg = $lt{'tclb'}.$linefeed.$lt{'howi'}.$linefeed. |
' ('.$lt{'adby'}.')'; |
&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'}; |
if ($context eq 'auto') { |
if ($context eq 'auto') { |
$outcome .= $badclass_msg.$linefeed; |
$outcome .= $badclass_msg.$linefeed; |
|
} else { |
$outcome .= '<div class="LC_warning">'.$badclass_msg.$linefeed.'<ul>'."\n"; |
$outcome .= '<div class="LC_warning">'.$badclass_msg.$linefeed.'<ul>'."\n"; |
foreach my $item (@badclasses) { |
} |
if ($context eq 'auto') { |
foreach my $item (@badclasses) { |
$outcome .= " - $item\n"; |
|
} else { |
|
$outcome .= "<li>$item</li>\n"; |
|
} |
|
} |
|
if ($context eq 'auto') { |
if ($context eq 'auto') { |
$outcome .= $linefeed; |
$outcome .= " - $item\n"; |
} else { |
} else { |
$outcome .= "</ul><br /><br /></div>\n"; |
$outcome .= "<li>$item</li>\n"; |
} |
} |
|
} |
|
if ($context eq 'auto') { |
|
$outcome .= $linefeed; |
|
} else { |
|
$outcome .= "</ul><br /><br /></div>\n"; |
} |
} |
} |
} |
if ($args->{'no_end_date'}) { |
if ($args->{'no_end_date'}) { |
Line 15436 sub construct_course {
|
Line 15747 sub construct_course {
|
if ($args->{'setcontent'}) { |
if ($args->{'setcontent'}) { |
$cenv{'question.email'}=$args->{'ccuname'}.':'.$args->{'ccdomain'}; |
$cenv{'question.email'}=$args->{'ccuname'}.':'.$args->{'ccdomain'}; |
} |
} |
|
if ($args->{'setcomment'}) { |
|
$cenv{'comment.email'}=$args->{'ccuname'}.':'.$args->{'ccdomain'}; |
|
} |
} |
} |
if ($args->{'reshome'}) { |
if ($args->{'reshome'}) { |
$cenv{'reshome'}=$args->{'reshome'}.'/'; |
$cenv{'reshome'}=$args->{'reshome'}.'/'; |
Line 15743 sub init_user_environment {
|
Line 16057 sub init_user_environment {
|
|
|
my $public=($username eq 'public' && $domain eq 'public'); |
my $public=($username eq 'public' && $domain eq 'public'); |
|
|
# See if old ID present, if so, remove |
|
|
|
my ($filename,$cookie,$userroles,$firstaccenv,$timerintenv); |
my ($filename,$cookie,$userroles,$firstaccenv,$timerintenv); |
my $now=time; |
my $now=time; |
|
|
Line 15766 sub init_user_environment {
|
Line 16078 sub init_user_environment {
|
} |
} |
if (!$cookie) { $cookie="publicuser_$oldest"; } |
if (!$cookie) { $cookie="publicuser_$oldest"; } |
} else { |
} else { |
# if this isn't a robot, kill any existing non-robot sessions |
# See if old ID present, if so, remove if this isn't a robot, |
|
# killing any existing non-robot sessions |
if (!$args->{'robot'}) { |
if (!$args->{'robot'}) { |
opendir(DIR,$lonids); |
opendir(DIR,$lonids); |
while ($filename=readdir(DIR)) { |
while ($filename=readdir(DIR)) { |
Line 15806 sub init_user_environment {
|
Line 16119 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 15859 sub init_user_environment {
|
Line 16171 sub init_user_environment {
|
$env{'user.noloadbalance'} = $lonhost; |
$env{'user.noloadbalance'} = $lonhost; |
} |
} |
|
|
my %is_adv = ( is_adv => $env{'user.adv'} ); |
if ($form->{'noloadbalance'}) { |
my %domdef; |
my @hosts = &Apache::lonnet::current_machine_ids(); |
unless ($domain eq 'public') { |
my $hosthere = $form->{'noloadbalance'}; |
%domdef = &Apache::lonnet::get_domain_defaults($domain); |
if (grep(/^\Q$hosthere\E$/,@hosts)) { |
|
$initial_env{"user.noloadbalance"} = $hosthere; |
|
$env{'user.noloadbalance'} = $hosthere; |
|
} |
} |
} |
|
|
foreach my $tool ('aboutme','blog','webdav','portfolio') { |
unless ($domain eq 'public') { |
$userenv{'availabletools.'.$tool} = |
my %is_adv = ( is_adv => $env{'user.adv'} ); |
&Apache::lonnet::usertools_access($username,$domain,$tool,'reload', |
my %domdef = &Apache::lonnet::get_domain_defaults($domain); |
undef,\%userenv,\%domdef,\%is_adv); |
|
} |
|
|
|
foreach my $crstype ('official','unofficial','community','textbook','placement') { |
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, |
\%userenv,\%domdef,\%is_adv); |
'reload','requestcourses', |
my %reqauthor = &Apache::lonnet::get('requestauthor',['author_status','author'], |
\%userenv,\%domdef,\%is_adv); |
$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'}; |
|
} |
} |
} |
|
|
|
|
$userenv{'canrequest.author'} = |
|
&Apache::lonnet::usertools_access($username,$domain,'requestauthor', |
|
'reload','requestauthor', |
|
\%userenv,\%domdef,\%is_adv); |
|
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'}; |
|
} |
|
} |
|
my ($types,$typename) = &course_types(); |
|
if (ref($types) eq 'ARRAY') { |
|
my @options = ('approval','validate','autolimit'); |
|
my $optregex = join('|',@options); |
|
my (%willtrust,%trustchecked); |
|
foreach my $type (@{$types}) { |
|
my $dom_str = $env{'environment.reqcrsotherdom.'.$type}; |
|
if ($dom_str ne '') { |
|
my $updatedstr = ''; |
|
my @possdomains = split(',',$dom_str); |
|
foreach my $entry (@possdomains) { |
|
my ($extdom,$extopt) = split(':',$entry); |
|
unless ($trustchecked{$extdom}) { |
|
$willtrust{$extdom} = &Apache::lonnet::will_trust('reqcrs',$domain,$extdom); |
|
$trustchecked{$extdom} = 1; |
|
} |
|
if ($willtrust{$extdom}) { |
|
$updatedstr .= $entry.','; |
|
} |
|
} |
|
$updatedstr =~ s/,$//; |
|
if ($updatedstr) { |
|
$userenv{'reqcrsotherdom.'.$type} = $updatedstr; |
|
} else { |
|
delete($userenv{'reqcrsotherdom.'.$type}); |
|
} |
|
} |
|
} |
|
} |
|
} |
$env{'user.environment'} = "$lonids/$cookie.id"; |
$env{'user.environment'} = "$lonids/$cookie.id"; |
|
|
if (tie(my %disk_env,'GDBM_File',"$lonids/$cookie.id", |
if (tie(my %disk_env,'GDBM_File',"$lonids/$cookie.id", |
Line 16508 sub search_courses {
|
Line 16856 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 16704 sub needs_coursereinit {
|
Line 17052 sub needs_coursereinit {
|
$interval = 600; |
$interval = 600; |
} |
} |
if (($now-$env{'request.course.timechecked'})>$interval) { |
if (($now-$env{'request.course.timechecked'})>$interval) { |
my $lastchange = &Apache::lonnet::get_coursechange($cdom,$cnum); |
|
&Apache::lonnet::appenv({'request.course.timechecked'=>$now}); |
&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); |
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 16838 sub recurse_supplemental {
|
Line 17190 sub recurse_supplemental {
|
} |
} |
|
|
sub symb_to_docspath { |
sub symb_to_docspath { |
my ($symb) = @_; |
my ($symb,$navmapref) = @_; |
return unless ($symb); |
return unless ($symb && ref($navmapref)); |
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 16847 sub symb_to_docspath {
|
Line 17199 sub symb_to_docspath {
|
$mapurl=$env{'course.'.$env{'request.course.id'}.'.url'}; |
$mapurl=$env{'course.'.$env{'request.course.id'}.'.url'}; |
} |
} |
my $mapresobj; |
my $mapresobj; |
my $navmap = Apache::lonnavmaps::navmap->new(); |
unless (ref($$navmapref)) { |
if (ref($navmap)) { |
$$navmapref = Apache::lonnavmaps::navmap->new(); |
$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 16859 sub symb_to_docspath {
|
Line 17213 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 = $navmap->getByMapPc($pc); |
my $res = $$navmapref->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 17068 sub check_recaptcha {
|
Line 17422 sub check_recaptcha {
|
my ($privkey,$version) = @_; |
my ($privkey,$version) = @_; |
my $captcha_chk; |
my $captcha_chk; |
if ($version >= 2) { |
if ($version >= 2) { |
my $ua = LWP::UserAgent->new; |
|
$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'}, |
); |
); |
my $response = $ua->post('https://www.google.com/recaptcha/api/siteverify',\%info); |
my $request=new HTTP::Request('POST','https://www.google.com/recaptcha/api/siteverify'); |
|
$request->content(join('&',map { |
|
my $name = escape($_); |
|
"$name=" . ( ref($info{$_}) eq 'ARRAY' |
|
? join("&$name=", map {escape($_) } @{$info{$_}}) |
|
: &escape($info{$_}) ); |
|
} keys(%info))); |
|
my $response = &LONCAPA::LWPReq::makerequest('',$request,'','',10,1); |
if ($response->is_success) { |
if ($response->is_success) { |
my $data = JSON::DWIW->from_json($response->decoded_content); |
my $data = JSON::DWIW->from_json($response->decoded_content); |
if (ref($data) eq 'HASH') { |
if (ref($data) eq 'HASH') { |
Line 17138 sub cleanup_html {
|
Line 17497 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) = @_; |
my ($interval,$context) = @_; |
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 $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'}, |
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}); |