version 1.412, 2006/07/02 12:36:08
|
version 1.448, 2006/08/30 19:36:49
|
Line 64 use HTML::Entities;
|
Line 64 use HTML::Entities;
|
use Apache::lonhtmlcommon(); |
use Apache::lonhtmlcommon(); |
use Apache::loncoursedata(); |
use Apache::loncoursedata(); |
use Apache::lontexconvert(); |
use Apache::lontexconvert(); |
|
use Apache::lonclonecourse(); |
use LONCAPA; |
use LONCAPA; |
|
|
my $readit; |
my $readit; |
Line 285 sub browser_and_searcher_javascript {
|
Line 286 sub browser_and_searcher_javascript {
|
} |
} |
url += 'element=' + elementname + ''; |
url += 'element=' + elementname + ''; |
var title = 'Browser'; |
var title = 'Browser'; |
var options = 'scrollbars=1,resizable=1,menubar=1,location=1'; |
var options = 'scrollbars=1,resizable=1,menubar=0,toolbar=1,location=1'; |
options += ',width=700,height=600'; |
options += ',width=700,height=600'; |
editbrowser = open(url,title,options,'1'); |
editbrowser = open(url,title,options,'1'); |
editbrowser.focus(); |
editbrowser.focus(); |
Line 306 sub browser_and_searcher_javascript {
|
Line 307 sub browser_and_searcher_javascript {
|
} |
} |
url += 'element=' + elementname + ''; |
url += 'element=' + elementname + ''; |
var title = 'Search'; |
var title = 'Search'; |
var options = 'scrollbars=1,resizable=1,menubar=0'; |
var options = 'scrollbars=1,resizable=1,menubar=0,toolbar=1,location=1'; |
options += ',width=700,height=600'; |
options += ',width=700,height=600'; |
editsearcher = open(url,title,options,'1'); |
editsearcher = open(url,title,options,'1'); |
editsearcher.focus(); |
editsearcher.focus(); |
Line 672 sub help_open_topic {
|
Line 673 sub help_open_topic {
|
{ |
{ |
$template .= |
$template .= |
"<table bgcolor='#3333AA' cellspacing='1' cellpadding='1' border='0'><tr>". |
"<table bgcolor='#3333AA' cellspacing='1' cellpadding='1' border='0'><tr>". |
"<td bgcolor='#5555FF'><a href=\"$link\"><font color='#FFFFFF' size='2'>$text</font></a>"; |
"<td bgcolor='#5555FF'><a target=\"_top\" href=\"$link\"><font color='#FFFFFF' size='2'>$text</font></a>"; |
} |
} |
|
|
# Add the graphic |
# Add the graphic |
my $title = &mt('Online Help'); |
my $title = &mt('Online Help'); |
my $helpicon=&lonhttpdurl("/adm/help/gif/smallHelp.gif"); |
my $helpicon=&lonhttpdurl("/adm/help/gif/smallHelp.gif"); |
$template .= <<"ENDTEMPLATE"; |
$template .= <<"ENDTEMPLATE"; |
<a href="$link" title="$title"><img src="$helpicon" border="0" alt="(Help: $topic)" /></a> |
<a target="_top" href="$link" title="$title"><img src="$helpicon" border="0" alt="(Help: $topic)" /></a> |
ENDTEMPLATE |
ENDTEMPLATE |
if ($text ne '') { $template.='</td></tr></table>' }; |
if ($text ne '') { $template.='</td></tr></table>' }; |
return $template; |
return $template; |
Line 706 sub helpLatexCheatsheet {
|
Line 707 sub helpLatexCheatsheet {
|
.'</td></tr></table>'; |
.'</td></tr></table>'; |
} |
} |
|
|
sub help_open_menu { |
sub general_help { |
my ($topic,$component_help,$faq,$bug,$stayOnPage,$width,$height,$text) = @_; |
my $helptopic='Student_Intro'; |
$text = "" if (not defined $text); |
if ($env{'request.role'}=~/^(ca|au)/) { |
$stayOnPage = 0 if (not defined $stayOnPage); |
$helptopic='Authoring_Intro'; |
if ($env{'browser.interface'} eq 'textual' || |
} elsif ($env{'request.role'}=~/^cc/) { |
$env{'environment.remote'} eq 'off' ) { |
$helptopic='Course_Coordination_Intro'; |
$stayOnPage=1; |
|
} |
} |
$width = 620 if (not defined $width); |
return $helptopic; |
$height = 600 if (not defined $height); |
} |
my $link=''; |
|
my $title = &mt('Get help'); |
sub update_help_link { |
|
my ($topic,$component_help,$faq,$bug,$stayOnPage) = @_; |
my $origurl = $ENV{'REQUEST_URI'}; |
my $origurl = $ENV{'REQUEST_URI'}; |
$origurl=~s|^/~|/priv/|; |
$origurl=~s|^/~|/priv/|; |
my $timestamp = time; |
my $timestamp = time; |
foreach my $datum (\$topic,\$component_help,\$faq,\$bug,\$origurl) { |
foreach my $datum (\$topic,\$component_help,\$faq,\$bug,\$origurl) { |
$$datum = &escape($$datum); |
$$datum = &escape($$datum); |
} |
} |
if (!$stayOnPage) { |
|
$link = "javascript:helpMenu('open')"; |
|
} else { |
|
$link = "javascript:helpMenu('display')"; |
|
} |
|
my $banner_link = "/adm/helpmenu?page=banner&topic=$topic&component_help=$component_help&faq=$faq&bug=$bug&origurl=$origurl&stamp=$timestamp&stayonpage=$stayOnPage"; |
my $banner_link = "/adm/helpmenu?page=banner&topic=$topic&component_help=$component_help&faq=$faq&bug=$bug&origurl=$origurl&stamp=$timestamp&stayonpage=$stayOnPage"; |
my $details_link = "/adm/helpmenu?page=body&topic=$topic&component_help=$component_help&faq=$faq&bug=$bug&origurl=$origurl&stamp=$timestamp"; |
my $output .= <<"ENDOUTPUT"; |
my $template; |
<script type="text/javascript"> |
if ($text ne "") { |
// <!-- BEGIN LON-CAPA Internal |
$template .= |
banner_link = '$banner_link'; |
"<table bgcolor='#CC3300' cellspacing='1' cellpadding='1' border='0'><tr>". |
// END LON-CAPA Internal --> |
"<td bgcolor='#CC6600'><a href=\"$link\"><font color='#FFFFFF' size='2'>$text</font></a>"; |
</script> |
|
ENDOUTPUT |
|
return $output; |
|
} |
|
|
|
# now just updates the help link and generates a blue icon |
|
sub help_open_menu { |
|
my ($topic,$component_help,$faq,$bug,$stayOnPage,$width,$height,$text) |
|
= @_; |
|
|
|
$stayOnPage = 0 if (not defined $stayOnPage); |
|
if ($env{'browser.interface'} eq 'textual' || |
|
$env{'environment.remote'} eq 'off' ) { |
|
$stayOnPage=1; |
} |
} |
|
my $output; |
|
if ($component_help) { |
|
if (!$text) { |
|
$output=&help_open_topic($component_help,undef,$stayOnPage, |
|
$width,$height); |
|
} else { |
|
my $help_text; |
|
$help_text=&unescape($topic); |
|
$output='<table><tr><td>'. |
|
&help_open_topic($component_help,$help_text,$stayOnPage, |
|
$width,$height).'</td></tr></table>'; |
|
} |
|
} |
|
my $banner_link = &update_help_link($topic,$component_help,$faq,$bug,$stayOnPage); |
|
return $output.$banner_link; |
|
} |
|
|
|
sub top_nav_help { |
|
my ($text) = @_; |
|
|
|
$text = &mt($text); |
|
|
|
my $stayOnPage = |
|
($env{'browser.interface'} eq 'textual' || |
|
$env{'environment.remote'} eq 'off' ); |
|
my $link= ($stayOnPage) ? "javascript:helpMenu('display')" |
|
: "javascript:helpMenu('open')"; |
|
my $banner_link = &update_help_link(undef,undef,undef,undef,$stayOnPage); |
|
|
|
my $title = &mt('Get help'); |
|
|
|
return <<"END"; |
|
$banner_link |
|
<a href="$link" title="$title">$text</a> |
|
END |
|
} |
|
|
|
sub help_menu_js { |
|
my ($text) = @_; |
|
|
|
my $stayOnPage = |
|
($env{'browser.interface'} eq 'textual' || |
|
$env{'environment.remote'} eq 'off' ); |
|
|
|
my $width = 620; |
|
my $height = 600; |
|
my $helptopic=&general_help(); |
|
my $details_link = '/adm/help/'.$helptopic.'.hlp'; |
my $nothing=&Apache::lonhtmlcommon::javascript_nothing(); |
my $nothing=&Apache::lonhtmlcommon::javascript_nothing(); |
my $helpicon=&lonhttpdurl("/adm/lonIcons/helpgateway.gif"); |
|
my $start_page = |
my $start_page = |
&Apache::loncommon::start_page('Help Menu', undef, |
&Apache::loncommon::start_page('Help Menu', undef, |
{'frameset' => 1, |
{'frameset' => 1, |
Line 750 sub help_open_menu {
|
Line 807 sub help_open_menu {
|
&Apache::loncommon::end_page({'frameset' => 1, |
&Apache::loncommon::end_page({'frameset' => 1, |
'js_ready' => 1,}); |
'js_ready' => 1,}); |
|
|
$template .= <<"ENDTEMPLATE"; |
my $template .= <<"ENDTEMPLATE"; |
<script type="text/javascript"> |
<script type="text/javascript"> |
// <!-- BEGIN LON-CAPA Internal |
// <!-- BEGIN LON-CAPA Internal |
// <![CDATA[ |
// <![CDATA[ |
|
var banner_link = ''; |
function helpMenu(target) { |
function helpMenu(target) { |
var caller = this; |
var caller = this; |
if (target == 'open') { |
if (target == 'open') { |
Line 773 function helpMenu(target) {
|
Line 831 function helpMenu(target) {
|
return; |
return; |
} |
} |
function writeHelp(caller) { |
function writeHelp(caller) { |
caller.document.writeln('$start_page<frame name="bannerframe" src="$banner_link" /><frame name="bodyframe" src="$details_link" /> $end_page') |
caller.document.writeln('$start_page<frame name="bannerframe" src="'+banner_link+'" /><frame name="bodyframe" src="$details_link" /> $end_page') |
caller.document.close() |
caller.document.close() |
caller.focus() |
caller.focus() |
} |
} |
// ]]> |
// ]]> |
// END LON-CAPA Internal --> |
// END LON-CAPA Internal --> |
</script> |
</script> |
<a href="$link" title="$title"><img src="$helpicon" border="0" alt="(Help Menu)" /></a> |
|
ENDTEMPLATE |
ENDTEMPLATE |
if ($component_help) { |
|
if (!$text) { |
|
$template=&help_open_topic($component_help,undef,$stayOnPage, |
|
$width,$height).' '.$template; |
|
} else { |
|
my $help_text; |
|
$help_text=&unescape($topic); |
|
$template='<table><tr><td>'. |
|
&help_open_topic($component_help,$help_text,$stayOnPage, |
|
$width,$height).'</td><td>'.$template. |
|
'</td></tr></table>'; |
|
} |
|
} |
|
if ($text ne '') { $template.='</td></tr></table>' }; |
|
return $template; |
return $template; |
} |
} |
|
|
Line 830 sub help_open_bug {
|
Line 873 sub help_open_bug {
|
{ |
{ |
$template .= |
$template .= |
"<table bgcolor='#AA3333' cellspacing='1' cellpadding='1' border='0'><tr>". |
"<table bgcolor='#AA3333' cellspacing='1' cellpadding='1' border='0'><tr>". |
"<td bgcolor='#FF5555'><a href=\"$link\"><font color='#FFFFFF' size='2'>$text</font></a>"; |
"<td bgcolor='#FF5555'><a target=\"_top\" href=\"$link\"><font color='#FFFFFF' size='2'>$text</font></a>"; |
} |
} |
|
|
# Add the graphic |
# Add the graphic |
my $title = &mt('Report a Bug'); |
my $title = &mt('Report a Bug'); |
my $bugicon=&lonhttpdurl("/adm/lonMisc/smallBug.gif"); |
my $bugicon=&lonhttpdurl("/adm/lonMisc/smallBug.gif"); |
$template .= <<"ENDTEMPLATE"; |
$template .= <<"ENDTEMPLATE"; |
<a href="$link" title="$title"><img src="$bugicon" border="0" alt="(Bug: $topic)" /></a> |
<a target="_top" href="$link" title="$title"><img src="$bugicon" border="0" alt="(Bug: $topic)" /></a> |
ENDTEMPLATE |
ENDTEMPLATE |
if ($text ne '') { $template.='</td></tr></table>' }; |
if ($text ne '') { $template.='</td></tr></table>' }; |
return $template; |
return $template; |
Line 875 sub help_open_faq {
|
Line 918 sub help_open_faq {
|
{ |
{ |
$template .= |
$template .= |
"<table bgcolor='#337733' cellspacing='1' cellpadding='1' border='0'><tr>". |
"<table bgcolor='#337733' cellspacing='1' cellpadding='1' border='0'><tr>". |
"<td bgcolor='#448844'><a href=\"$link\"><font color='#FFFFFF' size='2'>$text</font></a>"; |
"<td bgcolor='#448844'><a target=\"_top\" href=\"$link\"><font color='#FFFFFF' size='2'>$text</font></a>"; |
} |
} |
|
|
# Add the graphic |
# Add the graphic |
my $title = &mt('View the FAQ'); |
my $title = &mt('View the FAQ'); |
my $faqicon=&lonhttpdurl("/adm/lonMisc/smallFAQ.gif"); |
my $faqicon=&lonhttpdurl("/adm/lonMisc/smallFAQ.gif"); |
$template .= <<"ENDTEMPLATE"; |
$template .= <<"ENDTEMPLATE"; |
<a href="$link" title="$title"><img src="$faqicon" border="0" alt="(FAQ: $topic)" /></a> |
<a target="_top" href="$link" title="$title"><img src="$faqicon" border="0" alt="(FAQ: $topic)" /></a> |
ENDTEMPLATE |
ENDTEMPLATE |
if ($text ne '') { $template.='</td></tr></table>' }; |
if ($text ne '') { $template.='</td></tr></table>' }; |
return $template; |
return $template; |
Line 1918 sub get_related_words {
|
Line 1961 sub get_related_words {
|
return (); |
return (); |
} |
} |
my @Words=(); |
my @Words=(); |
|
my $count=0; |
if (exists($thesaurus_db{$keyword})) { |
if (exists($thesaurus_db{$keyword})) { |
# The first element is the number of times |
# The first element is the number of times |
# the word appears. We do not need it now. |
# the word appears. We do not need it now. |
(undef,@Words) = (split(/:/,$thesaurus_db{$keyword})); |
my (undef,@RelatedWords) = (split(/:/,$thesaurus_db{$keyword})); |
for (my $i=0;$i<=$#Words;$i++) { |
my (undef,$mostfrequentcount)=split(/\,/,$RelatedWords[0]); |
($Words[$i],undef)= split(/\,/,$Words[$i]); |
my $threshold=$mostfrequentcount/10; |
|
foreach my $possibleword (@RelatedWords) { |
|
my ($word,$wordcount)=split(/\,/,$possibleword); |
|
if ($wordcount>$threshold) { |
|
push(@Words,$word); |
|
$count++; |
|
if ($count>10) { last; } |
|
} |
} |
} |
} |
} |
untie %thesaurus_db; |
untie %thesaurus_db; |
Line 2002 sub nickname {
|
Line 2053 sub nickname {
|
|
|
sub getnames { |
sub getnames { |
my ($uname,$udom)=@_; |
my ($uname,$udom)=@_; |
|
if ($udom eq 'public' && $uname eq 'public') { |
|
return ('lastname' => &mt('Public')); |
|
} |
my $id=$uname.':'.$udom; |
my $id=$uname.':'.$udom; |
my ($names,$cached)=&Apache::lonnet::is_cached_new('namescache',$id); |
my ($names,$cached)=&Apache::lonnet::is_cached_new('namescache',$id); |
if ($cached) { |
if ($cached) { |
Line 2039 sub screenname {
|
Line 2093 sub screenname {
|
sub messagewrapper { |
sub messagewrapper { |
my ($link,$username,$domain,$subject,$text)=@_; |
my ($link,$username,$domain,$subject,$text)=@_; |
return |
return |
'<a href="/adm/email?compose=individual&'. |
'<a href="/adm/email?compose=individual&'. |
'recname='.$username.'&recdom='.$domain. |
'recname='.$username.'&recdom='.$domain. |
'&subject='.&escape($subject).'&text='.&escape($text).'" '. |
'&subject='.&escape($subject).'&text='.&escape($text).'" '. |
'title="'.&mt('Send message').'">'.$link.'</a>'; |
'title="'.&mt('Send message').'">'.$link.'</a>'; |
} |
} |
# --------------------------------------------------------------- Notes Wrapper |
# --------------------------------------------------------------- Notes Wrapper |
Line 2055 sub noteswrapper {
|
Line 2109 sub noteswrapper {
|
|
|
sub aboutmewrapper { |
sub aboutmewrapper { |
my ($link,$username,$domain,$target)=@_; |
my ($link,$username,$domain,$target)=@_; |
|
if (!defined($username) && !defined($domain)) { |
|
return; |
|
} |
return '<a href="/adm/'.$domain.'/'.$username.'/aboutme"'. |
return '<a href="/adm/'.$domain.'/'.$username.'/aboutme"'. |
($target?' target="$target"':'').' title="'.&mt('View this users personal page').'">'.$link.'</a>'; |
($target?' target="$target"':'').' title="'.&mt('View this users personal page').'">'.$link.'</a>'; |
} |
} |
Line 2085 sub track_student_link {
|
Line 2142 sub track_student_link {
|
$target = ''; |
$target = ''; |
} |
} |
if ($start) { $link.='&start='.$start; } |
if ($start) { $link.='&start='.$start; } |
return qq{<a href="$link" title="$title" $target>$linktext</a>}; |
|
|
return qq{<a href="$link" title="$title" $target>$linktext</a>}. |
|
&help_open_topic('View_recent_activity'); |
} |
} |
|
|
=pod |
=pod |
Line 2822 sub bodytag {
|
Line 2881 sub bodytag {
|
'alink' => &designparm($function.'.alink',$domain), |
'alink' => &designparm($function.'.alink',$domain), |
'vlink' => &designparm($function.'.vlink',$domain), |
'vlink' => &designparm($function.'.vlink',$domain), |
'link' => &designparm($function.'.link',$domain),); |
'link' => &designparm($function.'.link',$domain),); |
@$addentries{keys(%design)} = @design{keys(%design)}; |
@design{keys(%$addentries)} = @$addentries{keys(%$addentries)}; |
|
|
# role and realm |
# role and realm |
my ($role,$realm) = split(/\./,$env{'request.role'},2); |
my ($role,$realm) = split(/\./,$env{'request.role'},2); |
Line 2839 sub bodytag {
|
Line 2898 sub bodytag {
|
} else { |
} else { |
$role = &Apache::lonnet::plaintext($role); |
$role = &Apache::lonnet::plaintext($role); |
} |
} |
|
|
if (!$realm) { $realm=' '; } |
if (!$realm) { $realm=' '; } |
# Set messages |
# Set messages |
my $messages=&domainlogo($domain); |
my $messages=&domainlogo($domain); |
Line 2846 sub bodytag {
|
Line 2906 sub bodytag {
|
my $lonhttpdPort=$Apache::lonnet::perlvar{'lonhttpdPort'}; |
my $lonhttpdPort=$Apache::lonnet::perlvar{'lonhttpdPort'}; |
if (!defined($lonhttpdPort)) { $lonhttpdPort='8080'; } |
if (!defined($lonhttpdPort)) { $lonhttpdPort='8080'; } |
|
|
my $extra_body_attr = &make_attr_string($forcereg,$addentries); |
my $extra_body_attr = &make_attr_string($forcereg,\%design); |
|
|
# construct main body tag |
# construct main body tag |
my $bodytag = "<body $extra_body_attr>". |
my $bodytag = "<body $extra_body_attr>". |
Line 2867 sub bodytag {
|
Line 2927 sub bodytag {
|
} |
} |
|
|
my $name = &plainname($env{'user.name'},$env{'user.domain'}); |
my $name = &plainname($env{'user.name'},$env{'user.domain'}); |
|
if ($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public') { |
|
undef($role); |
|
} else { |
|
$name = &aboutmewrapper($name,$env{'user.name'},$env{'user.domain'}); |
|
} |
|
|
my $roleinfo=(<<ENDROLE); |
my $roleinfo=(<<ENDROLE); |
<td class="LC_title_bar_who"> |
<td class="LC_title_bar_who"> |
Line 3107 sub standard_css {
|
Line 3172 sub standard_css {
|
my $data_table_head = $tabbg; |
my $data_table_head = $tabbg; |
my $data_table_light = '#EEEEEE'; |
my $data_table_light = '#EEEEEE'; |
my $data_table_dark = '#DDD'; |
my $data_table_dark = '#DDD'; |
|
my $data_table_darker = '#CCC'; |
my $data_table_highlight = '#FFFF00'; |
my $data_table_highlight = '#FFFF00'; |
my $mail_new = '#FFBB77'; |
my $mail_new = '#FFBB77'; |
my $mail_new_hover = '#DD9955'; |
my $mail_new_hover = '#DD9955'; |
Line 3120 sub standard_css {
|
Line 3186 sub standard_css {
|
|
|
my $border = ($env{'browser.type'} eq 'explorer') ? '0px 2px 0px 2px' |
my $border = ($env{'browser.type'} eq 'explorer') ? '0px 2px 0px 2px' |
: '0px 3px 0px 4px'; |
: '0px 3px 0px 4px'; |
|
|
return <<END; |
return <<END; |
h1, h2, h3, th { font-family: $sans } |
h1, h2, h3, th { font-family: $sans } |
a:focus { color: red; background: yellow } |
a:focus { color: red; background: yellow } |
table.thinborder { border-collapse: collapse; } |
table.thinborder { border-collapse: collapse; } |
table.thinborder tr th, table.thinborder tr td { border-style: solid; border-width: 1px} |
table.thinborder tr th { border-style: solid; border-width: 1px; background: $tabbg;} |
|
table.thinborder tr td { border-style: solid; border-width: 1px} |
|
|
form, .inline { display: inline; } |
form, .inline { display: inline; } |
.center { text-align: center; } |
.center { text-align: center; } |
.LC_filename {font-family: $mono;} |
.LC_filename {font-family: $mono;} |
Line 3138 form, .inline { display: inline; }
|
Line 3207 form, .inline { display: inline; }
|
.LC_success { |
.LC_success { |
color: green; |
color: green; |
} |
} |
|
.LC_icon { |
|
border: 0px; |
|
} |
|
|
table#LC_top_nav, table#LC_menubuttons { |
table#LC_top_nav, table#LC_menubuttons { |
width: 100%; |
width: 100%; |
Line 3175 table#LC_title_bar td {
|
Line 3247 table#LC_title_bar td {
|
table#LC_title_bar td.LC_title_bar_who { |
table#LC_title_bar td.LC_title_bar_who { |
background: $tabbg; |
background: $tabbg; |
color: $font; |
color: $font; |
font: medium $sans; |
font: small $sans; |
text-align: right; |
text-align: right; |
} |
} |
span.LC_title_bar_title { |
span.LC_title_bar_title { |
font: bold xx-large $sans; |
font: bold x-large $sans; |
} |
} |
table#LC_title_bar td.LC_title_bar_domain_logo { |
table#LC_title_bar td.LC_title_bar_domain_logo { |
background: $sidebg; |
background: $sidebg; |
Line 3213 table#LC_top_nav td a, div#LC_top_nav a
|
Line 3285 table#LC_top_nav td a, div#LC_top_nav a
|
} |
} |
table#LC_top_nav td.LC_top_nav_logo { |
table#LC_top_nav td.LC_top_nav_logo { |
background: $tabbg; |
background: $tabbg; |
text-align: right; |
text-align: left; |
white-space: nowrap; |
white-space: nowrap; |
font-weight: bold; |
width: 31px; |
} |
} |
table#LC_top_nav td.LC_top_nav_logo img { |
table#LC_top_nav td.LC_top_nav_logo img { |
margin-left: 0.2em; |
border: 0px; |
vertical-align: bottom; |
vertical-align: bottom; |
} |
} |
|
table#LC_top_nav td.LC_top_nav_exit, |
|
table#LC_top_nav td.LC_top_nav_help { |
|
width: 2.0em; |
|
} |
|
table#LC_top_nav td.LC_top_nav_login { |
|
width: 4.0em; |
|
text-align: center; |
|
} |
table.LC_breadcrumbs td, table.LC_docs_path td { |
table.LC_breadcrumbs td, table.LC_docs_path td { |
background: $tabbg; |
background: $tabbg; |
color: $font; |
color: $font; |
Line 3261 td.LC_menubuttons_img {
|
Line 3341 td.LC_menubuttons_img {
|
font-weight: bold; |
font-weight: bold; |
} |
} |
|
|
|
table.LC_aboutme_port { |
|
border: 0px; |
|
border-collapse: collapse; |
|
border-spacing: 0px; |
|
} |
table.LC_data_table, table.LC_mail_list { |
table.LC_data_table, table.LC_mail_list { |
border: 1px solid #000000; |
border: 1px solid #000000; |
border-collapse: separate; |
border-collapse: separate; |
|
border-spacing: 1px; |
|
} |
|
.LC_data_table_dense { |
|
font-size: small; |
} |
} |
table.LC_data_table tr th, table.LC_calendar tr th, table.LC_mail_list tr th { |
table.LC_data_table tr th, table.LC_calendar tr th, table.LC_mail_list tr th { |
font-weight: bold; |
font-weight: bold; |
background-color: $data_table_head; |
background-color: $data_table_head; |
|
font-size: smaller; |
} |
} |
table.LC_data_table tr td { |
table.LC_data_table tr td, |
|
table.LC_aboutme_port tr td { |
background-color: $data_table_light; |
background-color: $data_table_light; |
|
padding: 2px; |
} |
} |
table.LC_data_table tr.LC_even_row td { |
table.LC_data_table tr.LC_even_row td, |
|
table.LC_aboutme_port tr.LC_even_row td { |
background-color: $data_table_dark; |
background-color: $data_table_dark; |
} |
} |
table.LC_data_table tr.LC_empty td { |
table.LC_data_table tr.LC_data_table_highlight td { |
|
background-color: $data_table_darker; |
|
} |
|
table.LC_data_table tr.LC_empty_row td { |
background-color: #FFFFFF; |
background-color: #FFFFFF; |
|
font-weight: bold; |
|
font-style: italic; |
|
text-align: center; |
|
padding: 8px; |
} |
} |
|
|
table.LC_calendar { |
table.LC_calendar { |
Line 3461 table#LC_helpmenu_links a:hover {
|
Line 3561 table#LC_helpmenu_links a:hover {
|
color: $vlink; |
color: $vlink; |
} |
} |
|
|
|
.LC_chrt_popup_exists { |
|
border: 1px solid #339933; |
|
margin: -1px; |
|
} |
|
.LC_chrt_popup_up { |
|
border: 1px solid yellow; |
|
margin: -1px; |
|
} |
|
.LC_chrt_popup { |
|
border: 1px solid #8888FF; |
|
background: #CCCCFF; |
|
} |
|
|
|
table.LC_pick_box { |
|
width: 100%; |
|
border-collapse: separate; |
|
background: white; |
|
border: 1px solid black; |
|
border-spacing: 1px; |
|
} |
|
table.LC_pick_box td.LC_pick_box_title { |
|
background: $tabbg; |
|
font-weight: bold; |
|
text-align: right; |
|
width: 184px; |
|
padding: 8px; |
|
} |
|
table.LC_pick_box td.LC_pick_box_separator { |
|
padding: 0px; |
|
height: 1px; |
|
background: black; |
|
} |
|
table.LC_pick_box td.LC_pick_box_submit { |
|
text-align: right; |
|
} |
|
|
|
table.LC_group_priv_box { |
|
background: white; |
|
border: 1px solid black; |
|
border-spacing: 1px; |
|
} |
|
table.LC_group_priv_box td.LC_pick_box_title { |
|
background: $tabbg; |
|
font-weight: bold; |
|
text-align: right; |
|
width: 184px; |
|
} |
|
table.LC_group_priv_box td.LC_groups_fixed { |
|
background: $data_table_light; |
|
text-align: center; |
|
} |
|
table.LC_group_priv_box td.LC_groups_optional { |
|
background: $data_table_dark; |
|
text-align: center; |
|
} |
|
table.LC_group_priv_box td.LC_groups_functionality { |
|
background: $data_table_darker; |
|
text-align: center; |
|
font-weight: bold; |
|
} |
|
table.LC_group_priv td { |
|
text-align: left; |
|
padding: 0px; |
|
} |
|
|
|
table.LC_notify_front_page { |
|
background: white; |
|
border: 1px solid black; |
|
padding: 8px; |
|
} |
|
table.LC_notify_front_page td { |
|
padding: 8px; |
|
} |
|
.LC_navbuttons { |
|
margin: 2ex 0ex 2ex 0ex; |
|
} |
|
.LC_topic_bar { |
|
font-family: $sans; |
|
font-weight: bold; |
|
width: 100%; |
|
background: $tabbg; |
|
vertical-align: middle; |
|
margin: 2ex 0ex 2ex 0ex; |
|
} |
|
.LC_topic_bar span { |
|
vertical-align: middle; |
|
} |
|
.LC_topic_bar img { |
|
vertical-align: bottom; |
|
} |
|
table.LC_course_group_status { |
|
margin: 20px; |
|
} |
|
table.LC_status_selector td { |
|
vertical-align: top; |
|
text-align: center; |
|
padding: 4px; |
|
} |
|
table.LC_descriptive_input td.LC_description { |
|
vertical-align: top; |
|
text-align: right; |
|
font-weight: bold; |
|
} |
|
|
END |
END |
} |
} |
|
|
Line 3477 Inputs: $title - optional title for the
|
Line 3681 Inputs: $title - optional title for the
|
$args - optional arguments |
$args - optional arguments |
force_register - if is true call registerurl so the remote is |
force_register - if is true call registerurl so the remote is |
informed |
informed |
redirect -> array ref of seconds before redirect occurs |
redirect -> array ref of |
url to redirect to |
1- seconds before redirect occurs |
|
2- url to redirect to |
|
3- whether the side effect should occur |
(side effect of setting |
(side effect of setting |
$env{'internal.head.redirect'} to the url |
$env{'internal.head.redirect'} to the url |
redirected too) |
redirected too) |
Line 3497 sub headtag {
|
Line 3703 sub headtag {
|
my $function = $args->{'function'} || &get_users_function(); |
my $function = $args->{'function'} || &get_users_function(); |
my $domain = $args->{'domain'} || &determinedomain(); |
my $domain = $args->{'domain'} || &determinedomain(); |
my $bgcolor = $args->{'bgcolor'} || &designparm($function.'.pgbg',$domain); |
my $bgcolor = $args->{'bgcolor'} || &designparm($function.'.pgbg',$domain); |
my $url = join(':',$env{'user.name'},$env{'user.domain'},time(), |
my $url = join(':',$env{'user.name'},$env{'user.domain'}, |
#$env{'environment.color.timestamp'}, |
#time(), |
|
$env{'environment.color.timestamp'}, |
$function,$domain,$bgcolor); |
$function,$domain,$bgcolor); |
|
|
$url = '/adm/css/'.&escape($url).'.css'; |
$url = '/adm/css/'.&escape($url).'.css'; |
|
|
my $result = |
my $result = |
'<head>'. |
'<head>'. |
'<link rel="stylesheet" type="text/css" href="'.$url.'" />'. |
|
&font_settings(). |
&font_settings(). |
&Apache::lonhtmlcommon::htmlareaheaders(); |
&Apache::lonhtmlcommon::htmlareaheaders(); |
|
|
if ($args->{'force_register'}) { |
if ($args->{'force_register'}) { |
$result .= &Apache::lonmenu::registerurl(1); |
$result .= &Apache::lonmenu::registerurl(1); |
} |
} |
|
if (!$args->{'no_nav_bar'} |
|
&& !$args->{'only_body'} |
|
&& !$args->{'frameset'}) { |
|
$result .= &help_menu_js(); |
|
} |
|
|
if (ref($args->{'redirect'})) { |
if (ref($args->{'redirect'})) { |
my ($time,$url) = @{$args->{'redirect'}}; |
my ($time,$url,$inhibit_continue) = @{$args->{'redirect'}}; |
$url = &Apache::lonenc::check_encrypt($url); |
$url = &Apache::lonenc::check_encrypt($url); |
$env{'internal.head.redirect'} = $url; |
if (!$inhibit_continue) { |
|
$env{'internal.head.redirect'} = $url; |
|
} |
$result.=<<ADDMETA |
$result.=<<ADDMETA |
<meta http-equiv="pragma" content="no-cache" /> |
<meta http-equiv="pragma" content="no-cache" /> |
<meta http-equiv="Refresh" content="$time; url=$url" /> |
<meta http-equiv="Refresh" content="$time; url=$url" /> |
Line 3526 ADDMETA
|
Line 3739 ADDMETA
|
$title = 'The LearningOnline Network with CAPA'; |
$title = 'The LearningOnline Network with CAPA'; |
} |
} |
|
|
$result .= '<title> LON-CAPA '.&mt($title).'</title>'.$head_extra; |
$result .= '<title> LON-CAPA '.&mt($title).'</title>' |
|
.'<link rel="stylesheet" type="text/css" href="'.$url.'" />' |
|
.$head_extra; |
return $result; |
return $result; |
} |
} |
|
|
Line 3677 sub start_page {
|
Line 3892 sub start_page {
|
#&Apache::lonnet::logthis("start_page ".join(':',caller(0))); |
#&Apache::lonnet::logthis("start_page ".join(':',caller(0))); |
my %head_args; |
my %head_args; |
foreach my $arg ('redirect','force_register','domain','function', |
foreach my $arg ('redirect','force_register','domain','function', |
'bgcolor') { |
'bgcolor','frameset','no_nav_bar','only_body') { |
if (defined($args->{$arg})) { |
if (defined($args->{$arg})) { |
$head_args{$arg} = $args->{$arg}; |
$head_args{$arg} = $args->{$arg}; |
} |
} |
Line 3825 sub simple_error_page {
|
Line 4040 sub simple_error_page {
|
{ |
{ |
my $row_count; |
my $row_count; |
sub start_data_table { |
sub start_data_table { |
|
my ($add_class) = @_; |
|
my $css_class = (join(' ','LC_data_table',$add_class)); |
undef($row_count); |
undef($row_count); |
return '<table class="LC_data_table">'."\n"; |
return '<table class="'.$css_class.'">'."\n"; |
} |
} |
|
|
sub end_data_table { |
sub end_data_table { |
Line 3835 sub simple_error_page {
|
Line 4052 sub simple_error_page {
|
} |
} |
|
|
sub start_data_table_row { |
sub start_data_table_row { |
|
my ($add_class) = @_; |
$row_count++; |
$row_count++; |
return '<tr '.(($row_count % 2)?'':'class="LC_even_row"').'>'."\n";; |
my $css_class = ($row_count % 2)?'':'LC_even_row'; |
|
$css_class = (join(' ',$css_class,$add_class)); |
|
return '<tr class="'.$css_class.'">'."\n";; |
} |
} |
|
|
sub end_data_table_row { |
sub end_data_table_row { |
return '</tr>'."\n";; |
return '</tr>'."\n";; |
} |
} |
|
|
|
sub start_data_table_empty_row { |
|
$row_count++; |
|
return '<tr class="LC_empty_row" >'."\n";; |
|
} |
|
|
|
sub end_data_table_empty_row { |
|
return '</tr>'."\n";; |
|
} |
|
|
sub start_data_table_header_row { |
sub start_data_table_header_row { |
return '<tr class="LC_header_row">'."\n";; |
return '<tr class="LC_header_row">'."\n";; |
} |
} |
Line 3943 sub check_user_status {
|
Line 4172 sub check_user_status {
|
|
|
Determines all the sections for a course including |
Determines all the sections for a course including |
sections with students and sections containing other roles. |
sections with students and sections containing other roles. |
Incoming parameters: domain, course number, |
Incoming parameters: |
reference to array containing roles for which sections should |
|
be gathered (optional). If the third argument is undefined, |
1. domain |
sections are gathered for any role. |
2. course number |
|
3. reference to array containing roles for which sections should |
|
be gathered (optional). |
|
4. reference to array containing status types for which sections |
|
should be gathered (optional). |
|
|
|
If the third argument is undefined, sections are gathered for any role. |
|
If the fourth argument is undefined, sections are gathered for any status. |
|
Permissible values are 'active' or 'future' or 'previous'. |
|
|
Returns section hash (keys are section IDs, values are |
Returns section hash (keys are section IDs, values are |
number of users in each section), subject to the |
number of users in each section), subject to the |
optional roles filter. |
optional roles filter, optional status filter |
|
|
=cut |
=cut |
|
|
############################################### |
############################################### |
sub get_sections { |
sub get_sections { |
my ($cdom,$cnum,$possible_roles) = @_; |
my ($cdom,$cnum,$possible_roles,$possible_status) = @_; |
if (!defined($cdom) || !defined($cnum)) { |
if (!defined($cdom) || !defined($cnum)) { |
my $cid = $env{'request.course.id'}; |
my $cid = $env{'request.course.id'}; |
|
|
Line 3967 sub get_sections {
|
Line 4204 sub get_sections {
|
} |
} |
|
|
my %sectioncount; |
my %sectioncount; |
|
my $now = time; |
|
|
if (!defined($possible_roles) || (grep(/^st$/,@$possible_roles))) { |
if (!defined($possible_roles) || (grep(/^st$/,@$possible_roles))) { |
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(); |
|
my $start_index = &Apache::loncoursedata::CL_START(); |
|
my $end_index = &Apache::loncoursedata::CL_END(); |
|
my $status; |
while (my ($student,$data) = each(%$classlist)) { |
while (my ($student,$data) = each(%$classlist)) { |
my ($section,$status) = ($data->[$sec_index], |
my ($section,$stu_status,$start,$end) = ($data->[$sec_index], |
$data->[$status_index]); |
$data->[$status_index], |
unless ($section eq '-1' || $section =~ /^\s*$/) { |
$data->[$start_index], |
$sectioncount{$section}++; |
$data->[$end_index]); |
|
if ($stu_status eq 'Active') { |
|
$status = 'active'; |
|
} elsif ($end < $now) { |
|
$status = 'previous'; |
|
} elsif ($start > $now) { |
|
$status = 'future'; |
|
} |
|
if ($section ne '-1' && $section !~ /^\s*$/) { |
|
if ((!defined($possible_status)) || (($status ne '') && |
|
(grep/^\Q$status\E$/,@{$possible_status}))) { |
|
$sectioncount{$section}++; |
|
} |
} |
} |
} |
} |
} |
} |
Line 3985 sub get_sections {
|
Line 4238 sub get_sections {
|
if ($user !~ /^(\w{2})/) { next; } |
if ($user !~ /^(\w{2})/) { next; } |
my ($role) = ($user =~ /^(\w{2})/); |
my ($role) = ($user =~ /^(\w{2})/); |
if ($possible_roles && !(grep(/^$role$/,@$possible_roles))) { next; } |
if ($possible_roles && !(grep(/^$role$/,@$possible_roles))) { next; } |
my $section; |
my ($section,$status); |
if ($role eq 'cr' && |
if ($role eq 'cr' && |
$user =~ m-^$role/[^/]*/[^/]*/[^/]*:[^:]*:[^:]*:(\w+)-) { |
$user =~ m-^$role/[^/]*/[^/]*/[^/]*:[^:]*:[^:]*:(\w+)-) { |
$section=$1; |
$section=$1; |
} |
} |
if ($user =~ /^$role:[^:]*:[^:]*:(\w+)/) { $section=$1; } |
if ($user =~ /^$role:[^:]*:[^:]*:(\w+)/) { $section=$1; } |
if (!defined($section) || $section eq '-1') { next; } |
if (!defined($section) || $section eq '-1') { next; } |
$sectioncount{$section}++; |
my ($end,$start) = ($courseroles{$user} =~ /^([^:]*):([^:]*)$/); |
|
if ($end == -1 && $start == -1) { |
|
next; #deleted role |
|
} |
|
if (!defined($possible_status)) { |
|
$sectioncount{$section}++; |
|
} else { |
|
if ((!$end || $end >= $now) && (!$start || $start <= $now)) { |
|
$status = 'active'; |
|
} elsif ($end < $now) { |
|
$status = 'future'; |
|
} elsif ($start > $now) { |
|
$status = 'previous'; |
|
} |
|
if (($status ne '') && (grep/^\Q$status\E$/,@{$possible_status})) { |
|
$sectioncount{$section}++; |
|
} |
|
} |
} |
} |
return %sectioncount; |
return %sectioncount; |
} |
} |
Line 4031 of the possibility of multiple values fo
|
Line 4301 of the possibility of multiple values fo
|
sub get_course_users { |
sub get_course_users { |
my ($cdom,$cnum,$types,$roles,$sections,$users,$userdata) = @_; |
my ($cdom,$cnum,$types,$roles,$sections,$users,$userdata) = @_; |
my %idx = (); |
my %idx = (); |
|
my %seclists; |
|
|
$idx{udom} = &Apache::loncoursedata::CL_SDOM(); |
$idx{udom} = &Apache::loncoursedata::CL_SDOM(); |
$idx{uname} = &Apache::loncoursedata::CL_SNAME(); |
$idx{uname} = &Apache::loncoursedata::CL_SNAME(); |
Line 4047 sub get_course_users {
|
Line 4318 sub get_course_users {
|
foreach my $student (keys(%{$classlist})) { |
foreach my $student (keys(%{$classlist})) { |
my $match = 0; |
my $match = 0; |
my $secmatch = 0; |
my $secmatch = 0; |
|
my $section = $$classlist{$student}[$idx{section}]; |
|
if ($section eq '') { |
|
$section = 'none'; |
|
} |
if ((ref($sections) eq 'ARRAY') && (@{$sections} > 0)) { |
if ((ref($sections) eq 'ARRAY') && (@{$sections} > 0)) { |
if (grep/^all$/,@{$sections}) { |
if (grep(/^all$/,@{$sections})) { |
$secmatch = 1; |
$secmatch = 1; |
} elsif ($$classlist{$student}[$idx{section}] eq '') { |
} elsif ($$classlist{$student}[$idx{section}] eq '') { |
if (grep/^none$/,@{$sections}) { |
if (grep(/^none$/,@{$sections})) { |
$secmatch = 1; |
$secmatch = 1; |
} |
} |
} else { |
} else { |
if (grep(/^\Q$$classlist{$student}[$idx{section}]\E$/, |
if (grep(/^\Q$section\E$/,@{$sections})) { |
@{$sections})) { |
|
$secmatch = 1; |
$secmatch = 1; |
} |
} |
} |
} |
if (!$secmatch) { |
if (!$secmatch) { |
next; |
next; |
} |
} |
} |
} |
|
push(@{$seclists{$student}},$section); |
if (defined($$types{'active'})) { |
if (defined($$types{'active'})) { |
if ($$classlist{$student}[$idx{status}] eq 'Active') { |
if ($$classlist{$student}[$idx{status}] eq 'Active') { |
push(@{$$users{st}{$student}},'active'); |
push(@{$$users{st}{$student}},'active'); |
Line 4088 sub get_course_users {
|
Line 4363 sub get_course_users {
|
} |
} |
} |
} |
if ((@{$roles} > 1) || ((@{$roles} == 1) && ($$roles[0] ne "st"))) { |
if ((@{$roles} > 1) || ((@{$roles} == 1) && ($$roles[0] ne "st"))) { |
my @coursepersonnel = &Apache::lonnet::getkeys('nohist_userroles',$cdom,$cnum); |
my %coursepersonnel = &Apache::lonnet::dump('nohist_userroles',$cdom,$cnum); |
foreach my $person (@coursepersonnel) { |
my $now = time; |
|
foreach my $person (sort(keys(%coursepersonnel))) { |
my $match = 0; |
my $match = 0; |
my $secmatch = 0; |
my $secmatch = 0; |
|
my $status; |
my ($role,$user,$usec) = ($person =~ /^([^:]*):([^:]+:[^:]+):([^:]*)/); |
my ($role,$user,$usec) = ($person =~ /^([^:]*):([^:]+:[^:]+):([^:]*)/); |
$user =~ s/:$//; |
$user =~ s/:$//; |
if (($role) && (grep(/^\Q$role\E$/,@{$roles}))) { |
my ($end,$start) = split(/:/,$coursepersonnel{$person}); |
|
if ($end == -1 || $start == -1) { |
|
next; |
|
} |
|
if (($role) && ((grep(/^\Q$role\E$/,@{$roles})) || |
|
(grep(/^cr$/,@{$roles}) && $role =~ /^cr\//))) { |
my ($uname,$udom) = split(/:/,$user); |
my ($uname,$udom) = split(/:/,$user); |
if ((ref($sections) eq 'ARRAY') && (@{$sections} > 0)) { |
if ((ref($sections) eq 'ARRAY') && (@{$sections} > 0)) { |
if (grep/^all$/,@{$sections}) { |
if (grep(/^all$/,@{$sections})) { |
$secmatch = 1; |
$secmatch = 1; |
} elsif ($usec eq '') { |
} elsif ($usec eq '') { |
if (grep/^none$/,@{$sections}) { |
if (grep(/^none$/,@{$sections})) { |
$secmatch = 1; |
$secmatch = 1; |
} |
} |
} else { |
} else { |
Line 4112 sub get_course_users {
|
Line 4394 sub get_course_users {
|
next; |
next; |
} |
} |
} |
} |
|
if ($usec eq '') { |
|
$usec = 'none'; |
|
} |
if ($uname ne '' && $udom ne '') { |
if ($uname ne '' && $udom ne '') { |
my $status = &check_user_status($udom,$uname,$cdom,$cnum,$role, |
if ($end < $now) { |
$usec); |
$status = 'previous'; |
|
} elsif ($start > $now) { |
|
$status = 'future'; |
|
} else { |
|
$status = 'active'; |
|
} |
foreach my $type (keys(%{$types})) { |
foreach my $type (keys(%{$types})) { |
if ($status eq $type) { |
if ($status eq $type) { |
@{$$users{$role}{$user}} = $type; |
if (!grep(/^\Q$type\E$/,@{$$users{$role}{$user}})) { |
|
push(@{$$users{$role}{$user}},$type); |
|
} |
$match = 1; |
$match = 1; |
} |
} |
} |
} |
if (($match) && (ref($userdata) eq 'HASH') && |
if (($match) && (ref($userdata) eq 'HASH')) { |
(!exists($$userdata{$uname.':'.$udom}))) { |
if (!exists($$userdata{$uname.':'.$udom})) { |
&get_user_info($udom,$uname,\%idx,$userdata); |
&get_user_info($udom,$uname,\%idx,$userdata); |
|
} |
|
if (!grep(/^\Q$usec\E$/,@{$seclists{$uname.':'.$udom}})) { |
|
push(@{$seclists{$uname.':'.$udom}},$usec); |
|
} |
} |
} |
} |
} |
} |
} |
Line 4133 sub get_course_users {
|
Line 4429 sub get_course_users {
|
my %csettings = &Apache::lonnet::get('environment',['internal.courseowner'],$cdom,$cnum); |
my %csettings = &Apache::lonnet::get('environment',['internal.courseowner'],$cdom,$cnum); |
if ( defined($csettings{'internal.courseowner'}) ) { |
if ( defined($csettings{'internal.courseowner'}) ) { |
my $owner = $csettings{'internal.courseowner'}; |
my $owner = $csettings{'internal.courseowner'}; |
@{$$users{'ow'}{$owner.':'.$cdom}} = 'any'; |
if ($owner !~ /^[^:]+:[^:]+$/) { |
|
$owner = $owner.':'.$cdom; |
|
} |
|
@{$$users{'ow'}{$owner}} = 'any'; |
if (defined($userdata) && |
if (defined($userdata) && |
!exists($$userdata{$owner.':'.$cdom})) { |
!exists($$userdata{$owner.':'.$cdom})) { |
&get_user_info($cdom,$owner,\%idx,$userdata); |
&get_user_info($cdom,$owner,\%idx,$userdata); |
|
if (!grep(/^none$/,@{$seclists{$owner.':'.$cdom}})) { |
|
push(@{$seclists{$owner.':'.$cdom}},'none'); |
|
} |
} |
} |
} |
} |
} |
} |
} |
} |
|
foreach my $user (keys(%seclists)) { |
|
@{$seclists{$user}} = (sort {$a <=> $b} @{$seclists{$user}}); |
|
$$userdata{$user}[$idx{section}] = join(',',@{$seclists{$user}}); |
|
} |
} |
} |
return; |
return; |
} |
} |
Line 5206 sub restore_course_settings {
|
Line 5512 sub restore_course_settings {
|
############################################################ |
############################################################ |
############################################################ |
############################################################ |
|
|
|
sub commit_customrole { |
|
my ($udom,$uname,$url,$three,$four,$five,$start,$end) = @_; |
|
my $output = &mt('Assigning custom role').' "'.$five.'" by '.$four.'@'.$three.' in '.$url. |
|
($start?', '.&mt('starting').' '.localtime($start):''). |
|
($end?', ending '.localtime($end):'').': <b>'. |
|
&Apache::lonnet::assigncustomrole( |
|
$udom,$uname,$url,$three,$four,$five,$end,$start). |
|
'</b><br />'; |
|
return $output; |
|
} |
|
|
|
sub commit_standardrole { |
|
my ($udom,$uname,$url,$three,$start,$end,$one,$two,$sec) = @_; |
|
my $output; |
|
my $logmsg; |
|
if ($three eq 'st') { |
|
my $result = &commit_studentrole(\$logmsg,$udom,$uname,$url,$three,$start,$end,$one,$two,$sec); |
|
if (($result =~ /^error/) || ($result eq 'not_in_class') || ($result eq 'unknown_course')) { |
|
$output = "Error: $result\n"; |
|
} else { |
|
$output = &mt('Assigning').' '.$three.' in '.$url. |
|
($start?', '.&mt('starting').' '.localtime($start):''). |
|
($end?', '.&mt('ending').' '.localtime($end):''). |
|
': <b>'.$result.'</b><br />'. |
|
&mt('Add to classlist').': <b>ok</b><br />'; |
|
} |
|
} else { |
|
$output = &mt('Assigning').' '.$three.' in '.$url. |
|
($start?', '.&mt('starting').' '.localtime($start):''). |
|
($end?', '.&mt('ending').' '.localtime($end):'').': <b>'. |
|
&Apache::lonnet::assignrole( |
|
$udom,$uname,$url,$three,$end,$start). |
|
'</b><br />'; |
|
} |
|
return $output; |
|
} |
|
|
|
sub commit_studentrole { |
|
my ($logmsg,$udom,$uname,$url,$three,$start,$end,$one,$two,$sec) = @_; |
|
my $linefeed = '<br />'."\n"; |
|
my $result; |
|
if (defined($one) && defined($two)) { |
|
my $cid=$one.'_'.$two; |
|
my $oldsec=&Apache::lonnet::getsection($udom,$uname,$cid); |
|
my $secchange = 0; |
|
my $expire_role_result; |
|
my $modify_section_result; |
|
unless ($oldsec eq '-1') { |
|
unless ($sec eq $oldsec) { |
|
$secchange = 1; |
|
my $uurl='/'.$cid; |
|
$uurl=~s/\_/\//g; |
|
if ($oldsec) { |
|
$uurl.='/'.$oldsec; |
|
} |
|
$expire_role_result = &Apache::lonnet::assignrole($udom,$uname,$uurl,'st',time); |
|
$result = $expire_role_result; |
|
} |
|
} |
|
if (($expire_role_result eq 'ok') || ($secchange == 0)) { |
|
$modify_section_result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,'','',$cid); |
|
if ($modify_section_result =~ /^ok/) { |
|
if ($secchange == 1) { |
|
$$logmsg .= "Section for $uname switched from old section: $oldsec to new section: $sec".$linefeed; |
|
} elsif ($oldsec eq '-1') { |
|
$$logmsg .= "New student role for $uname in section $sec in course $cid".$linefeed; |
|
} else { |
|
$$logmsg .= "Student $uname assigned to unchanged section $sec in course $cid".$linefeed; |
|
} |
|
} else { |
|
$$logmsg .= "Error when attempting section change for $uname from old section $oldsec to new section: $sec in course $cid -error: $modify_section_result".$linefeed; |
|
} |
|
$result = $modify_section_result; |
|
} elsif ($secchange == 1) { |
|
$$logmsg .= "Error when attempting to expire role for $uname in old section $oldsec in course $cid -error: $expire_role_result".$linefeed; |
|
} |
|
} else { |
|
$$logmsg .= "Incomplete course id defined. Addition of user $uname from domain $udom to course $one\_$two, section $sec not completed.$linefeed"; |
|
$result = "error: incomplete course id\n"; |
|
} |
|
return $result; |
|
} |
|
|
|
############################################################ |
|
############################################################ |
|
|
|
sub construct_course { |
|
my ($args,$logmsg,$courseid,$crsudom,$crsunum,$udom,$uname) = @_; |
|
my $outcome; |
|
|
|
# |
|
# Open course |
|
# |
|
my $crstype = lc($args->{'crstype'}); |
|
my %cenv=(); |
|
$$courseid=&Apache::lonnet::createcourse($args->{'course_domain'}, |
|
$args->{'cdescr'}, |
|
$args->{'curl'}, |
|
$args->{'course_home'}, |
|
$args->{'nonstandard'}, |
|
$args->{'crscode'}, |
|
$args->{'ccuname'}.':'. |
|
$args->{'ccdomain'}, |
|
$args->{'crstype'}); |
|
|
|
# Note: The testing routines depend on this being output; see |
|
# Utils::Course. This needs to at least be output as a comment |
|
# if anyone ever decides to not show this, and Utils::Course::new |
|
# will need to be suitably modified. |
|
$outcome .= &mt('New LON-CAPA [_1] ID: [_2]<br />',$crstype,$$courseid); |
|
# |
|
# Check if created correctly |
|
# |
|
($$crsudom,$$crsunum)=($$courseid=~/^\/(\w+)\/(\w+)$/); |
|
my $crsuhome=&Apache::lonnet::homeserver($$crsunum,$$crsudom); |
|
$outcome .= &mt('Created on').': '.$crsuhome.'<br>'; |
|
# |
|
# Are we cloning? |
|
# |
|
my $cloneid=''; |
|
if (($args->{'clonecourse'}) && ($args->{'clonedomain'})) { |
|
$cloneid='/'.$args->{'clonedomain'}.'/'.$args->{'clonecourse'}; |
|
my ($clonecrsudom,$clonecrsunum)=($cloneid=~/^\/(\w+)\/(\w+)$/); |
|
my $clonehome=&Apache::lonnet::homeserver($clonecrsunum,$clonecrsudom); |
|
if ($clonehome eq 'no_host') { |
|
$outcome .= |
|
'<br /><font color="red">'.&mt('Attempting to clone non-existing [_1]',$crstype).' '.$cloneid.'</font>'; |
|
} else { |
|
$outcome .= |
|
'<br /><font color="green">'.&mt('Cloning [_1] from [_2]',$crstype,$clonehome).'</font>'; |
|
my %oldcenv=&Apache::lonnet::dump('environment',$$crsudom,$$crsunum); |
|
# Copy all files |
|
&Apache::lonclonecourse::copycoursefiles($cloneid,$$courseid); |
|
# Restore URL |
|
$cenv{'url'}=$oldcenv{'url'}; |
|
# Restore title |
|
$cenv{'description'}=$oldcenv{'description'}; |
|
# restore grading mode |
|
if (defined($oldcenv{'grading'})) { |
|
$cenv{'grading'}=$oldcenv{'grading'}; |
|
} |
|
# Mark as cloned |
|
$cenv{'clonedfrom'}=$cloneid; |
|
delete($cenv{'default_enrollment_start_date'}); |
|
delete($cenv{'default_enrollment_end_date'}); |
|
} |
|
} |
|
# |
|
# Set environment (will override cloned, if existing) |
|
# |
|
my @sections = (); |
|
my @xlists = (); |
|
if ($args->{'crstype'}) { |
|
$cenv{'type'}=$args->{'crstype'}; |
|
} |
|
if ($args->{'crsid'}) { |
|
$cenv{'courseid'}=$args->{'crsid'}; |
|
} |
|
if ($args->{'crscode'}) { |
|
$cenv{'internal.coursecode'}=$args->{'crscode'}; |
|
} |
|
if ($args->{'crsquota'} ne '') { |
|
$cenv{'internal.coursequota'}=$args->{'crsquota'}; |
|
} else { |
|
$cenv{'internal.coursequota'}=$args->{'crsquota'} = 20; |
|
} |
|
if ($args->{'ccuname'}) { |
|
$cenv{'internal.courseowner'} = $args->{'ccuname'}. |
|
':'.$args->{'ccdomain'}; |
|
} else { |
|
$cenv{'internal.courseowner'} = $args->{'curruser'}; |
|
} |
|
|
|
my @badclasses = (); # Used to accumulate sections/crosslistings that did not pass classlist access check for course owner. |
|
if ($args->{'crssections'}) { |
|
$cenv{'internal.sectionnums'} = ''; |
|
if ($args->{'crssections'} =~ m/,/) { |
|
@sections = split/,/,$args->{'crssections'}; |
|
} else { |
|
$sections[0] = $args->{'crssections'}; |
|
} |
|
if (@sections > 0) { |
|
foreach my $item (@sections) { |
|
my ($sec,$gp) = split/:/,$item; |
|
my $class = $args->{'crscode'}.$sec; |
|
my $addcheck = &Apache::lonnet::auto_new_course($$crsunum,$$crsudom,$class,$cenv{'internal.courseowner'}); |
|
$cenv{'internal.sectionnums'} .= $item.','; |
|
unless ($addcheck eq 'ok') { |
|
push @badclasses, $class; |
|
} |
|
} |
|
$cenv{'internal.sectionnums'} =~ s/,$//; |
|
} |
|
} |
|
# do not hide course coordinator from staff listing, |
|
# even if privileged |
|
$cenv{'nothideprivileged'}=$args->{'ccuname'}.':'.$args->{'ccdomain'}; |
|
# add crosslistings |
|
if ($args->{'crsxlist'}) { |
|
$cenv{'internal.crosslistings'}=''; |
|
if ($args->{'crsxlist'} =~ m/,/) { |
|
@xlists = split/,/,$args->{'crsxlist'}; |
|
} else { |
|
$xlists[0] = $args->{'crsxlist'}; |
|
} |
|
if (@xlists > 0) { |
|
foreach my $item (@xlists) { |
|
my ($xl,$gp) = split/:/,$item; |
|
my $addcheck = &Apache::lonnet::auto_new_course($$crsunum,$$crsudom,$xl,$cenv{'internal.courseowner'}); |
|
$cenv{'internal.crosslistings'} .= $item.','; |
|
unless ($addcheck eq 'ok') { |
|
push @badclasses, $xl; |
|
} |
|
} |
|
$cenv{'internal.crosslistings'} =~ s/,$//; |
|
} |
|
} |
|
if ($args->{'autoadds'}) { |
|
$cenv{'internal.autoadds'}=$args->{'autoadds'}; |
|
} |
|
if ($args->{'autodrops'}) { |
|
$cenv{'internal.autodrops'}=$args->{'autodrops'}; |
|
} |
|
# check for notification of enrollment changes |
|
my @notified = (); |
|
if ($args->{'notify_owner'}) { |
|
if ($args->{'ccuname'} ne '') { |
|
push(@notified,$args->{'ccuname'}.':'.$args->{'ccdomain'}); |
|
} |
|
} |
|
if ($args->{'notify_dc'}) { |
|
if ($uname ne '') { |
|
push(@notified,$uname.'@'.$udom); |
|
} |
|
} |
|
if (@notified > 0) { |
|
my $notifylist; |
|
if (@notified > 1) { |
|
$notifylist = join(',',@notified); |
|
} else { |
|
$notifylist = $notified[0]; |
|
} |
|
$cenv{'internal.notifylist'} = $notifylist; |
|
} |
|
if (@badclasses > 0) { |
|
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', |
|
'dnhr' => 'does not have rights to access enrollment in these classes', |
|
'adby' => 'as determined by the policies of your institution on access to official classlists' |
|
); |
|
$outcome .= '<font color="red">'.$lt{'tclb'}.' ('.$cenv{'internal.courseowner'}.') - '.$lt{'dnhr'}.' ('.$lt{'adby'}.').<br /><ul>'."\n"; |
|
foreach (@badclasses) { |
|
$outcome .= "<li>$_</li>\n"; |
|
} |
|
$outcome .= "</ul><br /><br /></font>\n"; |
|
} |
|
if ($args->{'no_end_date'}) { |
|
$args->{'endaccess'} = 0; |
|
} |
|
$cenv{'internal.autostart'}=$args->{'enrollstart'}; |
|
$cenv{'internal.autoend'}=$args->{'enrollend'}; |
|
$cenv{'default_enrollment_start_date'}=$args->{'startaccess'}; |
|
$cenv{'default_enrollment_end_date'}=$args->{'endaccess'}; |
|
if ($args->{'showphotos'}) { |
|
$cenv{'internal.showphotos'}=$args->{'showphotos'}; |
|
} |
|
$cenv{'internal.authtype'} = $args->{'authtype'}; |
|
$cenv{'internal.autharg'} = $args->{'autharg'}; |
|
if ( ($cenv{'internal.authtype'} =~ /^krb/) && ($cenv{'internal.autoadds'} == 1)) { |
|
if (! defined($cenv{'internal.autharg'}) || $cenv{'internal.autharg'} eq '') { |
|
$outcome .= '<font color="red" size="+1">'. |
|
&mt('As you did not include the default Kerberos domain to be used for authentication in this class, the institutional data used by the automated enrollment process must include the Kerberos domain for each new student').'</font></p>'; |
|
} |
|
} |
|
if (($args->{'ccdomain'}) && ($args->{'ccuname'})) { |
|
if ($args->{'setpolicy'}) { |
|
$cenv{'policy.email'}=$args->{'ccuname'}.':'.$args->{'ccdomain'}; |
|
} |
|
if ($args->{'setcontent'}) { |
|
$cenv{'question.email'}=$args->{'ccuname'}.':'.$args->{'ccdomain'}; |
|
} |
|
} |
|
if ($args->{'reshome'}) { |
|
$cenv{'reshome'}=$args->{'reshome'}.'/'; |
|
$cenv{'reshome'}=~s/\/+$/\//; |
|
} |
|
# |
|
# course has keyed access |
|
# |
|
if ($args->{'setkeys'}) { |
|
$cenv{'keyaccess'}='yes'; |
|
} |
|
# if specified, key authority is not course, but user |
|
# only active if keyaccess is yes |
|
if ($args->{'keyauth'}) { |
|
$args->{'keyauth'}=~s/[^\w\@]//g; |
|
if ($args->{'keyauth'}) { |
|
$cenv{'keyauth'}=$args->{'keyauth'}; |
|
} |
|
} |
|
|
|
if ($args->{'disresdis'}) { |
|
$cenv{'pch.roles.denied'}='st'; |
|
} |
|
if ($args->{'disablechat'}) { |
|
$cenv{'plc.roles.denied'}='st'; |
|
} |
|
|
|
# Record we've not yet viewed the Course Initialization Helper for this |
|
# course |
|
$cenv{'course.helper.not.run'} = 1; |
|
# |
|
# Use new Randomseed |
|
# |
|
$cenv{'rndseed'}=&Apache::lonnet::latest_rnd_algorithm_id();; |
|
$cenv{'receiptalg'}=&Apache::lonnet::latest_receipt_algorithm_id();; |
|
# |
|
# The encryption code and receipt prefix for this course |
|
# |
|
$cenv{'internal.encseed'}=$Apache::lonnet::perlvar{'lonReceipt'}.$$.time.int(rand(9999)); |
|
$cenv{'internal.encpref'}=100+int(9*rand(99)); |
|
# |
|
# By default, use standard grading |
|
if (!defined($cenv{'grading'})) { $cenv{'grading'} = 'standard'; } |
|
|
|
$outcome .= ('<br />'.&mt('Setting environment').': '. |
|
&Apache::lonnet::put('environment',\%cenv,$$crsudom,$$crsunum).'<br>'); |
|
# |
|
# Open all assignments |
|
# |
|
if ($args->{'openall'}) { |
|
my $storeunder=$$crsudom.'_'.$$crsunum.'.0.opendate'; |
|
my %storecontent = ($storeunder => time, |
|
$storeunder.'.type' => 'date_start'); |
|
|
|
$outcome .= &mt('Opening all assignments').': '.&Apache::lonnet::cput |
|
('resourcedata',\%storecontent,$$crsudom,$$crsunum).'<br>'; |
|
} |
|
# |
|
# Set first page |
|
# |
|
unless (($args->{'nonstandard'}) || ($args->{'firstres'} eq 'blank') |
|
|| ($cloneid)) { |
|
use LONCAPA::map; |
|
$outcome .= &mt('Setting first resource').': '; |
|
|
|
my $map = '/uploaded/'.$$crsudom.'/'.$$crsunum.'/default.sequence'; |
|
my ($errtext,$fatal)=&LONCAPA::map::mapread($map); |
|
|
|
$outcome .= ($fatal?$errtext:'read ok').' - '; |
|
my $title; my $url; |
|
if ($args->{'firstres'} eq 'syl') { |
|
$title='Syllabus'; |
|
$url='/public/'.$$crsudom.'/'.$$crsunum.'/syllabus'; |
|
} else { |
|
$title='Navigate Contents'; |
|
$url='/adm/navmaps'; |
|
} |
|
|
|
$LONCAPA::map::resources[1]=$title.':'.$url.':false:start:res'; |
|
(my $outtext,$errtext) = &LONCAPA::map::storemap($map,1); |
|
|
|
if ($errtext) { $fatal=2; } |
|
$outcome .= ($fatal?$errtext:'write ok').'<br />'; |
|
} |
|
return $outcome; |
|
} |
|
|
|
############################################################ |
|
############################################################ |
|
|
sub course_type { |
sub course_type { |
my ($cid) = @_; |
my ($cid) = @_; |
if (!defined($cid)) { |
if (!defined($cid)) { |
Line 5250 sub lonhttpdurl {
|
Line 5927 sub lonhttpdurl {
|
return 'http://'.$ENV{'SERVER_NAME'}.':'.$lonhttpd_port.$url; |
return 'http://'.$ENV{'SERVER_NAME'}.':'.$lonhttpd_port.$url; |
} |
} |
|
|
|
sub absolute_url { |
|
my ($host_name) = @_; |
|
my $protocol = ($ENV{'SERVER_PORT'} == 443?'https://':'http://'); |
|
if ($host_name eq '') { |
|
$host_name = $ENV{'SERVER_NAME'}; |
|
} |
|
return $protocol.$host_name; |
|
} |
|
|
sub connection_aborted { |
sub connection_aborted { |
my ($r)=@_; |
my ($r)=@_; |
$r->print(" ");$r->rflush(); |
$r->print(" ");$r->rflush(); |