--- loncom/interface/lonpreferences.pm 2004/11/19 20:17:52 1.50 +++ loncom/interface/lonpreferences.pm 2008/05/28 01:45:48 1.122 @@ -1,7 +1,7 @@ # The LearningOnline Network # Preferences # -# $Id: lonpreferences.pm,v 1.50 2004/11/19 20:17:52 albertel Exp $ +# $Id: lonpreferences.pm,v 1.122 2008/05/28 01:45:48 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -33,6 +33,7 @@ package Apache::lonpreferences; use strict; +use LONCAPA; use Apache::Constants qw(:common); use Apache::File; use Crypt::DES; @@ -40,6 +41,8 @@ use DynaLoader; # for Crypt::DES version use Apache::loncommon(); use Apache::lonhtmlcommon(); use Apache::lonlocal; +use Apache::lonnet; +use LONCAPA(); # # Write lonnet::passwd to do the call below. @@ -97,20 +100,20 @@ sub wysiwygchanger { my $r = shift; my %userenv = &Apache::lonnet::get ('environment',['wysiwygeditor']); + my $onselect='checked="checked"'; my $offselect=''; - my $onselect='checked="1"'; - if ($userenv{'wysiwygeditor'}) { + if ($userenv{'wysiwygeditor'} eq 'on') { $onselect=''; - $offselect='checked="1"'; + $offselect='checked="checked"'; } my $switchoff=&mt('Disable WYSIWYG editor'); my $switchon=&mt('Enable WYSIWYG editor'); $r->print(< +

- $switchoff
- $switchon +
+ ENDLSCREEN $r->print('
'); } @@ -118,9 +121,9 @@ ENDLSCREEN sub verify_and_change_wysiwyg { my $r = shift; - my $newsetting=$ENV{'form.wysiwyg'}; + my $newsetting=$env{'form.wysiwyg'}; &Apache::lonnet::put('environment',{'wysiwygeditor' => $newsetting}); - &Apache::lonnet::appenv('environment.wysiwygeditor' => $newsetting); + &Apache::lonnet::appenv({'environment.wysiwygeditor' => $newsetting}); $r->print('

'.&mt('Setting WYSIWYG editor to:').' '.&mt($newsetting).'

'); } @@ -129,8 +132,8 @@ sub verify_and_change_wysiwyg { ################################################################ sub languagechanger { my $r = shift; - my $user = $ENV{'user.name'}; - my $domain = $ENV{'user.domain'}; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; my %userenv = &Apache::lonnet::get ('environment',['languages']); my $language=$userenv{'languages'}; @@ -146,7 +149,7 @@ sub languagechanger { my $selectionbox=&Apache::loncommon::select_form($language,'language', %langchoices); $r->print(< +
$pref: $selectionbox ENDLSCREEN @@ -156,23 +159,118 @@ ENDLSCREEN sub verify_and_change_languages { my $r = shift; - my $user = $ENV{'user.name'}; - my $domain = $ENV{'user.domain'}; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; # Screenname - my $newlanguage = $ENV{'form.language'}; + my $newlanguage = $env{'form.language'}; $newlanguage=~s/[^\-\w]//g; my $message=''; if ($newlanguage) { &Apache::lonnet::put('environment',{'languages' => $newlanguage}); - &Apache::lonnet::appenv('environment.languages' => $newlanguage); - $message='Set new preferred languages to '.$newlanguage; + &Apache::lonnet::appenv({'environment.languages' => $newlanguage}); + $message=&mt('Set new preferred languages to ').'"'.$newlanguage.'".'; } else { &Apache::lonnet::del('environment',['languages']); &Apache::lonnet::delenv('environment\.languages'); - $message='Reset preferred language'; + $message=&mt('Reset preferred language.'); } $r->print(< 'Default', + 'tth' => 'TeX to HTML', + #'ttm' => 'TeX to MathML', + 'jsMath' => 'jsMath', + 'mimetex' => 'Convert to Images' + ); + my $selectionbox=&Apache::loncommon::select_form($texengine,'texengine', + %mathchoices); + my $jsMath_start=&Apache::lontexconvert::jsMath_header(); + my $change=&mt('Change'); + $r->print(< + + + +

$pref: $selectionbox

+

+ +Examples: +

TeX to HTML
+ +

+

jsMath
+$jsMath_start + + +

+

Convert to Images
+
+ +

+ENDLSCREEN + if ($env{'environment.texengine'} ne 'jsMath') { + $r->print(''); + } +} + + +sub verify_and_change_texengine { + my $r = shift; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; +# Screenname + my $newtexengine = $env{'form.texengine'}; + $newtexengine=~s/[^\-\w]//g; + if ($newtexengine eq 'ttm') { + &Apache::lonnet::appenv({'browser.mathml' => 1}); + } else { + if ($env{'environment.texengine'} eq 'ttm') { + &Apache::lonnet::appenv({'browser.mathml' => 0}); + } + } + my $message=''; + if ($newtexengine) { + &Apache::lonnet::put('environment',{'texengine' => $newtexengine}); + &Apache::lonnet::appenv({'environment.texengine' => $newtexengine}); + $message=&mt('Set new preferred math display to ').'"'.$newtexengine.'".'; + } else { + &Apache::lonnet::del('environment',['texengine']); + &Apache::lonnet::delenv('environment\.texengine'); + $message=&mt('Reset preferred math display.'); + } + + + $r->print(<print(<Some LON-CAPA users have a long list of roles. The Recent Roles Hotlist -feature keeps track of the last N roles which have been -visited and places a table of these at the top of the roles page. -People with very few roles should leave this feature disabled. -

+# Get list of recent roles and display with checkbox in front + my $roles_check_list = ''; + my $role_key=''; + if ($env{'environment.recentroles'}) { + my %recent_roles = + &Apache::lonhtmlcommon::get_recent('roles',$env{'environment.recentrolesn'}); + my %frozen_roles = + &Apache::lonhtmlcommon::get_recent_frozen('roles',$env{'environment.recentrolesn'}); + + my %role_text = &rolespref_get_role_text([keys(%recent_roles)]); + my @sorted_roles = sort {$role_text{$a} cmp $role_text{$b}} keys(%role_text); + + $roles_check_list .= + &Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row(). + "".&mt('Freeze '.$role)."". + "".&mt($role)."". + &Apache::loncommon::end_data_table_header_row(). + "\n"; + my $count; + foreach $role_key (@sorted_roles) { + my $checked = ""; + my $value = $recent_roles{$role_key}; + if ($frozen_roles{$role_key}) { + $checked = "checked=\"checked\""; + } + $count++; + $roles_check_list .= + &Apache::loncommon::start_data_table_row(). + ''. + "". + "". + &Apache::loncommon::end_data_table_row(). "\n"; + } + $roles_check_list .= "\n"; + } -
+ $r->print(' +

'.&mt('Some LON-CAPA users have a long list of '.$lc_role.'s. The Recent '.$role.'s Hotlist feature keeps track of the last N '.$lc_role.'s which have been visited and places a table of these at the top of the '.$lc_role.'s page. People with very few '.$lc_role.'s should leave this feature disabled.').' +

+ -
Enable Recent Roles Hotlist: - -
Number of roles in Hotlist: +
+
'.&mt('Number of '.$role.'s in Hotlist:').' +

'.&mt('This list below can be used to freeze '.$lc_role.'s on your screen. Those marked as frozen will not be removed from the list, even if they have not been used recently.').' +

+'.$roles_check_list.'
- -
-ENDSCREEN + +'); +} + +sub rolespref_get_role_text { +# Get a line of text for each role + my ($roles) = @_; + my %roletext = (); + + foreach my $item (@$roles) { +# get course information + my ($role,$rest) = split(/\./, $item); + my $trole = ""; + $trole = &Apache::lonnet::plaintext($role); + my ($tdomain,$other,$tsection)= split(/\//,Apache::lonnet::declutter($rest)); + my $tother = '-'; + if ($role =~ /^(cc|st|in|ta|ep|cr)/ ) { + my %newhash=&Apache::lonnet::coursedescription($tdomain."_".$other); + $tother = " - ".$newhash{'description'}; + } elsif ($role =~ /dc/) { + $tother = ""; + } else { + $tother = " - $other"; + } + + my $section=""; + if ($tsection) { + $section = " - Section/Group: $tsection"; + } + $roletext{$item} = $tdomain." - ".$trole.$tother.$section; + } + return %roletext; } sub verify_and_change_rolespref { my $r = shift; - my $user = $ENV{'user.name'}; - my $domain = $ENV{'user.domain'}; + my $role = ($env{'user.adv'} ? 'Role' : 'Course'); + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; # Recent Roles Hotlist Flag - my $hotlist_flag = $ENV{'form.recentroles'}; - my $hotlist_n = $ENV{'form.recentrolesn'}; - my $message=''; + my $hotlist_flag = $env{'form.recentroles'}; + my $hotlist_n = $env{'form.recentrolesn'}; + my $message='
'; if ($hotlist_flag) { &Apache::lonnet::put('environment',{'recentroles' => $hotlist_flag}); - &Apache::lonnet::appenv('environment.recentroles' => $hotlist_flag); - $message='Recent Roles Hotlist is Enabled'; + &Apache::lonnet::appenv({'environment.recentroles' => $hotlist_flag}); + $message=&mt('Recent '.$role.'s Hotlist is Enabled'); } else { &Apache::lonnet::del('environment',['recentroles']); &Apache::lonnet::delenv('environment\.recentroles'); - $message='Recent Roles Hotlist is Disabled'; + $message=&mt('Recent '.$role.'s Hotlist is Disabled'); } if ($hotlist_n) { &Apache::lonnet::put('environment',{'recentrolesn' => $hotlist_n}); - &Apache::lonnet::appenv('environment.recentrolesn' => $hotlist_n); + &Apache::lonnet::appenv({'environment.recentrolesn' => $hotlist_n}); if ($hotlist_flag) { - $message.="
Display $hotlist_n Most Recent Roles\n"; + $message.="
". + &mt('Display [_1] Most Recent '.$role.'s',$hotlist_n)."\n"; + } + } + +# Get list of froze roles and list of recent roles + my @freeze_list = &Apache::loncommon::get_env_multiple('form.freezeroles'); + my %freeze = (); + my %roletext = (); + + foreach my $key (@freeze_list) { + $freeze{$key}='1'; + } + + my %recent_roles = + &Apache::lonhtmlcommon::get_recent('roles',$env{'environment.recentrolesn'}); + my %frozen_roles = + &Apache::lonhtmlcommon::get_recent_frozen('roles',$env{'environment.recentrolesn'}); + my %role_text = &rolespref_get_role_text([keys(%recent_roles)]); + +# Unset any roles that were previously frozen but aren't in list + foreach my $role_key (sort(keys(%recent_roles))) { + if (($frozen_roles{$role_key}) && (!exists($freeze{$role_key}))) { + $message .= "
".&mt('Unfreezing '.$role.': [_1]',$role_text{$role_key})."\n"; + &Apache::lonhtmlcommon::store_recent('roles',$role_key,' ',0); + } + } + +# Freeze selected roles + foreach my $role_key (@freeze_list) { + if (!$frozen_roles{$role_key}) { + $message .= "
".&mt('Freezing '.$role.': [_1]',$role_text{$role_key})."\n"; + &Apache::lonhtmlcommon::store_recent('roles', + $role_key,' ',1); } } + $message .= "

\n"; $r->print(< $message ENDRPSCREEN } @@ -260,149 +461,540 @@ ENDRPSCREEN ################################################################ sub screennamechanger { my $r = shift; - my $user = $ENV{'user.name'}; - my $domain = $ENV{'user.domain'}; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; my %userenv = &Apache::lonnet::get ('environment',['screenname','nickname']); my $screenname=$userenv{'screenname'}; my $nickname=$userenv{'nickname'}; + my %lt = &Apache::lonlocal::texthash( + text_screenname => 'New screenname (shown if you post anonymously):', + text_nickname => 'New nickname (shown if you post non-anonymously):', + text_submit => 'Change', + ); $r->print(< +
-
New screenname (shown if you post anonymously): +
$lt{'text_screenname'} -
New nickname (shown if you post non-anonymously): +
$lt{'text_nickname'} - +
+
ENDSCREEN } sub verify_and_change_screenname { my $r = shift; - my $user = $ENV{'user.name'}; - my $domain = $ENV{'user.domain'}; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; # Screenname - my $newscreen = $ENV{'form.screenname'}; + my $newscreen = $env{'form.screenname'}; $newscreen=~s/[^ \w]//g; my $message=''; if ($newscreen) { &Apache::lonnet::put('environment',{'screenname' => $newscreen}); - &Apache::lonnet::appenv('environment.screenname' => $newscreen); - $message='Set new screenname to '.$newscreen; + &Apache::lonnet::appenv({'environment.screenname' => $newscreen}); + $message=&mt('Set new screenname to ').'"'.$newscreen.'.".'; } else { &Apache::lonnet::del('environment',['screenname']); &Apache::lonnet::delenv('environment\.screenname'); - $message='Reset screenname'; + $message=&mt('Reset screenname.'); } # Nickname $message.='
'; - $newscreen = $ENV{'form.nickname'}; + $newscreen = $env{'form.nickname'}; $newscreen=~s/[^ \w]//g; if ($newscreen) { &Apache::lonnet::put('environment',{'nickname' => $newscreen}); - &Apache::lonnet::appenv('environment.nickname' => $newscreen); - $message.='Set new nickname to '.$newscreen; + &Apache::lonnet::appenv({'environment.nickname' => $newscreen}); + $message.=&mt('Set new nickname to ').'"'.$newscreen.'".'; } else { &Apache::lonnet::del('environment',['nickname']); &Apache::lonnet::delenv('environment\.nickname'); - $message.='Reset nickname'; + $message.=&mt('Reset nickname.'); } - + &Apache::lonnet::devalidate_cache_new('namescache',$user.':'.$domain); $r->print(< $message ENDVCSCREEN } ################################################################ +# Icon Subroutines # +################################################################ +sub iconchanger { + my $r = shift; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; + my %userenv = &Apache::lonnet::get + ('environment',['icons']); + my $iconic='checked="checked"'; + my $classic=''; + my $onlyicon=''; + if ($userenv{'icons'} eq 'classic') { + $classic='checked="checked"'; + $iconic=''; + } + if ($userenv{'icons'} eq 'iconsonly') { + $onlyicon='checked="checked"'; + $iconic=''; + } + my $useicons=&mt('Use icons and text'); + my $usebuttons=&mt('Use buttons and text'); + my $useicononly=&mt('Use icons only'); + my $change=&mt('Change'); + $r->print(< + +
+
+
+ + +ENDSCREEN +} + +sub verify_and_change_icons { + my $r = shift; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; + my $newicons = $env{'form.menumode'}; + + &Apache::lonnet::put('environment',{'icons' => $newicons}); + &Apache::lonnet::appenv({'environment.icons' => $newicons}); + $r->print(&mt('Set menu mode to [_1].',$newicons)); +} + +################################################################ +# Clicker Subroutines # +################################################################ + +sub clickerchanger { + my $r = shift; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; + my %userenv = &Apache::lonnet::get + ('environment',['clickers']); + my $clickers=$userenv{'clickers'}; + $clickers=~s/\,/\n/gs; + my $text=&mt('Enter response device ("clicker") numbers'); + my $change=&mt('Register'); + my $helplink=&Apache::loncommon::help_open_topic('Clicker_Registration',&mt('Locating your clicker ID')); + $r->print(< + + + + +ENDSCREEN +} + +sub verify_and_change_clicker { + my $r = shift; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; + my $newclickers = $env{'form.clickers'}; + $newclickers=~s/[^\w\:\-]+/\,/gs; + $newclickers=~tr/a-z/A-Z/; + $newclickers=~s/[\:\-]+/\-/g; + $newclickers=~s/\,+/\,/g; + $newclickers=~s/^\,//; + $newclickers=~s/\,$//; + &Apache::lonnet::put('environment',{'clickers' => $newclickers}); + &Apache::lonnet::appenv({'environment.clickers' => $newclickers}); + $r->print(&mt('Registering clickers: [_1]',$newclickers)); +} + +################################################################ +# Domcoord Access Subroutines # +################################################################ + +sub domcoordchanger { + my $r = shift; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; + my %userenv = &Apache::lonnet::get + ('environment',['domcoord.author']); + my $constchecked=''; + if ($userenv{'domcoord.author'} eq 'blocked') { + $constchecked='checked="checked"'; + } + my $text=&mt('By default, the Domain Coordinator can enter your construction space.'); + my $construction=&mt('Block access to construction space'); + my $change=&mt('Change'); + $r->print(< + +$text
+
+ + +ENDSCREEN +} + +sub verify_and_change_domcoord { + my $r = shift; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; + my %domcoord=('domcoord.author' => ''); + if ($env{'form.construction'}) { $domcoord{'domcoord.author'}='blocked'; } + &Apache::lonnet::put('environment',\%domcoord); + &Apache::lonnet::appenv({'environment.domcoord.author' => $domcoord{'domcoord.author'}}); + $r->print(&mt('Registering Domain Coordinator access restrictions.')); +} + +################################################################# +## Lock Subroutines # +################################################################# + +sub lockwarning { + my $r = shift; + my $title=&mt('Action locked'); + my $texttop=&mt('LON-CAPA is currently performing the following actions:'); + my $textbottom=&mt('Changing roles or logging out may result in data corruption.'); + my ($num,%which)=&Apache::lonnet::get_locks(); + my $which=''; + foreach my $id (keys %which) { + $which.='
  • '.$which{$id}.'
  • '; + } + my $change=&mt('Override'); + $r->print(< + +

    $title

    +$texttop +
      +$which +
    +$textbottom + + +ENDSCREEN +} + +sub verify_and_change_lockwarning { + my $r = shift; + &Apache::lonnet::remove_all_locks(); + $r->print(&mt('Cleared locks.')); +} + + +################################################################ # Message Forward # ################################################################ sub msgforwardchanger { - my $r = shift; - my $user = $ENV{'user.name'}; - my $domain = $ENV{'user.domain'}; - my %userenv = &Apache::lonnet::get('environment',['msgforward','notification','critnotification']); + my ($r,$message) = @_; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; + my %userenv = &Apache::lonnet::get('environment',['msgforward','notification','critnotification','notifywithhtml']); my $msgforward=$userenv{'msgforward'}; - my $notification=$userenv{'notification'}; - my $critnotification=$userenv{'critnotification'}; - my $forwardingHelp = Apache::loncommon::help_open_topic("Prefs_Forwarding", - "What are forwarding ". - "and notification ". - "addresses"); - my $criticalMessageHelp = Apache::loncommon::help_open_topic("Course_Critical_Message", - "What are critical messages"); + my %lt = &Apache::lonlocal::texthash( + all => 'All', + crit => 'Critical only', + reg => 'Non-critical only', + foad => 'Forwarding Address(es)', + noti => 'Notification E-mail Address(es)', + foad_exmpl => 'e.g. userA:domain1,userB:domain2,...', + mnot => 'Email Address(es) which should be notified about new LON-CAPA messages', # old: 'Message Notification Email Address(es)', + mnot_exmpl => 'e.g. joe@doe.com', + chg => 'Change', + email => 'The e-mail address entered in row ', + notv => 'is not a valid e-mail address', + toen => "To enter multiple addresses, enter one address at a time, click 'Change' and then add the next one", + prme => 'Back to preferences menu', + ); + my $forwardingHelp = &Apache::loncommon::help_open_topic("Prefs_Forwarding"); + my $notificationHelp = &Apache::loncommon::help_open_topic("Prefs_Notification"); + my $criticalMessageHelp = &Apache::loncommon::help_open_topic("Course_Critical_Message"); + my @allow_html = split(/,/,$userenv{'notifywithhtml'}); + my %allnot = &get_notifications(\%userenv); + my $validatescript = &Apache::lonhtmlcommon::javascript_valid_email(); + my $jscript = qq| + +|; $r->print(< -
    +$jscript +$message +

    $lt{'foad'} $forwardingHelp

    + -New Forwarding Address(es) (user:domain,user:domain,...): -
    -New Message Notification Email Address(es) (joe\@doe.com,jane\@doe.edu,...): -
    -New Critical Message Notification Email Address(es) (joe\@doe.com,jane\@doe.edu,...): -$criticalMessageHelp
    - -
    +$lt{'foad'} ($lt{'foad_exmpl'}): +
    +

    $lt{'noti'} $notificationHelp

    +$lt{'mnot'} ($lt{'mnot_exmpl'}):
    ENDMSG + my @sortforwards = sort (keys(%allnot)); + my $output = &Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row(). + ' '. + ''.&mt('Action').''. + ''.&mt('Notification address').''. + &mt('Types of message for which notification is sent'). + $criticalMessageHelp.''. + &mt('Excerpt retains HTML tags in message').''. + &Apache::loncommon::end_data_table_header_row(); + my $num = 0; + my $counter = 1; + foreach my $item (@sortforwards) { + $output .= &Apache::loncommon::start_data_table_row(). + ''.$counter.''. + '   '. + ''. + ''; + my %chk; + if (defined($allnot{$item}{'crit'})) { + if (defined($allnot{$item}{'reg'})) { + $chk{'all'} = 'checked="checked" '; + } else { + $chk{'crit'} = 'checked="checked" '; + } + } else { + $chk{'reg'} = 'checked="checked" '; + } + foreach my $type ('all','crit','reg') { + $output .= ' '; + } + my $htmlon = ''; + my $htmloff = ''; + if (grep/^\Q$item\E/,@allow_html) { + $htmlon = 'checked="checked" '; + } else { + $htmloff = 'checked="checked" '; + } + $output .= ' '. + ''. + &Apache::loncommon::end_data_table_row(); + $num ++; + $counter ++; + } + my %defchk = ( + all => 'checked="checked" ', + crit => '', + reg => '', + ); + $output .= &Apache::loncommon::start_data_table_row(). + ''.$counter.''. + ''. + ''; + foreach my $type ('all','crit','reg') { + $output .= ' '; + } + $output .= ' '. + ''. + &Apache::loncommon::end_data_table_row(). + &Apache::loncommon::end_data_table(); + $num ++; + $r->print($output); + $r->print(qq| +

    + + + + +|); + +} + +sub get_notifications { + my ($userenv) = @_; + my %allnot; + my @critnot = split(/,/,$userenv->{'critnotification'}); + my @regnot = split(/,/,$userenv->{'notification'}); + foreach my $item (@critnot) { + $allnot{$item}{crit} = 1; + } + foreach my $item (@regnot) { + $allnot{$item}{reg} = 1; + } + return %allnot; } sub verify_and_change_msgforward { my $r = shift; - my $user = $ENV{'user.name'}; - my $domain = $ENV{'user.domain'}; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; my $newscreen = ''; my $message=''; - foreach (split(/\,/,$ENV{'form.msgforward'})) { + foreach (split(/\,/,$env{'form.msgforward'})) { my ($msuser,$msdomain)=split(/[\@\:]/,$_); - $msuser=~s/\W//g; - $msdomain=~s/\W//g; + $msuser = &LONCAPA::clean_username($msuser); + $msdomain = &LONCAPA::clean_domain($msdomain); if (($msuser) && ($msdomain)) { if (&Apache::lonnet::homeserver($msuser,$msdomain) ne 'no_host') { $newscreen.=$msuser.':'.$msdomain.','; } else { - $message.='No such user: '.$msuser.':'.$msdomain.'
    '; + $message.= &mt('No such user: ').''.$msuser.':'.$msdomain.'
    '; } } } $newscreen=~s/\,$//; if ($newscreen) { &Apache::lonnet::put('environment',{'msgforward' => $newscreen}); - &Apache::lonnet::appenv('environment.msgforward' => $newscreen); - $message.='Set new message forwarding to '.$newscreen.'
    '; + &Apache::lonnet::appenv({'environment.msgforward' => $newscreen}); + $message .= &mt('Set message forwarding to ').'"'.$newscreen.'".' + .'
    '; } else { &Apache::lonnet::del('environment',['msgforward']); &Apache::lonnet::delenv('environment\.msgforward'); - $message.='Reset message forwarding
    '; + $message.= &mt("Set message forwarding to 'off'.").'
    '; } - my $notification=$ENV{'form.notification'}; + my $critnotification; + my $notification; + my $notify_with_html; + my $lastnotify = $env{'form.numnotify'}-1; + my $totaladdresses = 0; + for (my $i=0; $i<$env{'form.numnotify'}; $i++) { + if ((!defined($env{'form.del_notify_'.$i})) && + ((($i==$lastnotify) && ($env{'form.add_notify_'.$lastnotify} == 1)) || + ($i<$lastnotify))) { + if (defined($env{'form.address_'.$i})) { + if ($env{'form.notify_type_'.$i} eq 'all') { + $critnotification .= $env{'form.address_'.$i}.','; + $notification .= $env{'form.address_'.$i}.','; + } elsif ($env{'form.notify_type_'.$i} eq 'crit') { + $critnotification .= $env{'form.address_'.$i}.','; + } elsif ($env{'form.notify_type_'.$i} eq 'reg') { + $notification .= $env{'form.address_'.$i}.','; + } + if ($env{'form.html_'.$i} eq '1') { + $notify_with_html .= $env{'form.address_'.$i}.','; + } + $totaladdresses ++; + } + } + } + $critnotification =~ s/,$//; + $critnotification=~s/\s//gs; + $notification =~ s/,$//; $notification=~s/\s//gs; + $notify_with_html =~ s/,$//; + $notify_with_html =~ s/\s//gs; if ($notification) { &Apache::lonnet::put('environment',{'notification' => $notification}); - &Apache::lonnet::appenv('environment.notification' => $notification); - $message.='Set message notification address to '.$notification.'
    '; + &Apache::lonnet::appenv({'environment.notification' => $notification}); + $message.=&mt('Set non-critical message notification address(es) to ').'"'.$notification.'".
    '; } else { &Apache::lonnet::del('environment',['notification']); &Apache::lonnet::delenv('environment\.notification'); - $message.='Reset message notification
    '; + $message.=&mt("Set non-critical message notification to 'off'.").'
    '; } - my $critnotification=$ENV{'form.critnotification'}; - $critnotification=~s/\s//gs; if ($critnotification) { &Apache::lonnet::put('environment',{'critnotification' => $critnotification}); - &Apache::lonnet::appenv('environment.critnotification' => $critnotification); - $message.='Set critical message notification address to '.$critnotification; + &Apache::lonnet::appenv({'environment.critnotification' => $critnotification}); + $message.=&mt('Set critical message notification address(es) to ').'"'.$critnotification.'".
    '; } else { &Apache::lonnet::del('environment',['critnotification']); &Apache::lonnet::delenv('environment\.critnotification'); - $message.='Reset critical message notification
    '; + $message.=&mt("Set critical message notification to 'off'.").'
    '; } - $r->print(< -$message -ENDVCMSG + if ($critnotification || $notification) { + if ($notify_with_html) { + &Apache::lonnet::put('environment',{'notifywithhtml' => $notify_with_html}); + &Apache::lonnet::appenv({'environment.notifywithhtml' => $notify_with_html}); + $message.=&mt('Set address(es) to receive excerpts with html retained ').'"'.$notify_with_html.'".'; + } else { + &Apache::lonnet::del('environment',['notifywithhtml']); + &Apache::lonnet::delenv('environment\.notifywithhtml'); + if ($totaladdresses == 1) { + $message.=&mt("Set notification address to receive excerpts with html stripped."); + } else { + $message.=&mt("Set all notification addresses to receive excerpts with html stripped."); + } + } + } else { + &Apache::lonnet::del('environment',['notifywithhtml']); + &Apache::lonnet::delenv('environment\.notifywithhtml'); + } + if ($message) { + $message .= '

    '; + } + &Apache::loncommon::flush_email_cache($user,$domain); + &msgforwardchanger($r,$message); } ################################################################ @@ -412,17 +1004,7 @@ ENDVCMSG sub colorschanger { my $r = shift; # figure out colors - my $function='student'; - if ($ENV{'request.role'}=~/^(cc|in|ta|ep)/) { - $function='coordinator'; - } - if ($ENV{'request.role'}=~/^(su|dc|ad|li)/) { - $function='admin'; - } - if (($ENV{'request.role'}=~/^(au|ca)/) || - ($ENV{'REQUEST_URI'}=~/^(\/priv|\~)/)) { - $function='author'; - } + my $function=&Apache::loncommon::get_users_function(); my $domain=&Apache::loncommon::determinedomain(); my %colortypes=('pgbg' => 'Page Background', 'tabbg' => 'Header Background', @@ -431,19 +1013,23 @@ sub colorschanger { 'link' => 'Un-Visited Link', 'vlink' => 'Visited Link', 'alink' => 'Active Link'); + my $start_data_table = &Apache::loncommon::start_data_table(); my $chtable=''; foreach my $item (sort(keys(%colortypes))) { my $curcol=&Apache::loncommon::designparm($function.'.'.$item,$domain); - $chtable.=''.$colortypes{$item}.'      Select'; + .$item."','parmform.pres','psub'".');">Select'. + &Apache::loncommon::end_data_table_row()."\n"; } + my $end_data_table = &Apache::loncommon::end_data_table(); my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition(); $r->print(< + -$errormessage - -

    - +|; +} -

    - - - - - -
    +sub client_form { + my ($caller,$hexkey,$currentpass,$defdom) = @_; + my %lt=&Apache::lonlocal::texthash( + 'email' => 'E-mail Address', + 'username' => 'Username', + 'domain' => 'Domain', + 'currentpass' => 'Current Password', + 'newpass' => 'New Password', + 'confirmpass' => 'Confirm Password', + 'changepass' => 'Change Password'); + my $output = qq|
    - +|; + if ($caller eq 'reset_by_email') { + $output .= qq| + + + + + + + +'; + } else { + $output .= qq| + - +|; + } + $output .= <<"ENDFORM"; + - +
    Current password:
    :
    : + + +
    : +|; + $output .= &Apache::loncommon::select_dom_form($defdom,'udom').' +
    New password:
    Confirm password:
    - +
    - - - - - - + + + + + +

    ENDFORM - # - return; + return $output; +} + +sub server_form { + my ($logtoken,$caller,$mailtoken) = @_; + my $action = '/adm/preferences'; + if ($caller eq 'reset_by_email') { + $action = '/adm/resetpw'; + } + my $output = qq| +
    + + + + + |; + if ($caller eq 'reset_by_email') { + $output .= qq| + + + + +|; + } + $output .= qq| + +
    +|; + return $output; } sub verify_and_change_password { - my $r = shift; - my $user = $ENV{'user.name'}; - my $domain = $ENV{'user.domain'}; - my $homeserver = $ENV{'user.home'}; + my ($r,$caller,$mailtoken) = @_; + my ($user,$domain,$homeserver); + if ($caller eq 'reset_by_email') { + $user = $env{'form.uname'}; + $domain = $env{'form.udom'}; + if ($user ne '' && $domain ne '') { + $homeserver = &Apache::lonnet::homeserver($user,$domain); + if ($homeserver eq 'no_host') { + &passwordchanger($r,"

    \n". + &mt("Invalid username and/or domain")."\n

    ", + $caller,$mailtoken); + return 1; + } + } else { + &passwordchanger($r,"

    \n". + &mt("Username and domain were blank")."\n

    ", + $caller,$mailtoken); + return 1; + } + } else { + $user = $env{'user.name'}; + $domain = $env{'user.domain'}; + $homeserver = $env{'user.home'}; + } my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain); # Check for authentication types that allow changing of the password. - return if ($currentauth !~ /^(unix|internal):/); - # - $r->print(< - -LON-CAPA Preferences: Change password for $user - -ENDHEADER + if ($currentauth !~ /^(unix|internal):/) { + if ($caller eq 'reset_by_email') { + &passwordchanger($r,"

    \n". + &mt("Authentication type for this user can not be changed by this mechanism"). + "\n

    ", + $caller,$mailtoken); + return 1; + } else { + return; + } + } # - my $currentpass = $ENV{'form.currentpass'}; - my $newpass1 = $ENV{'form.newpass_1'}; - my $newpass2 = $ENV{'form.newpass_2'}; - my $logtoken = $ENV{'form.logtoken'}; + my $currentpass = $env{'form.currentpass'}; + my $newpass1 = $env{'form.newpass_1'}; + my $newpass2 = $env{'form.newpass_2'}; + my $logtoken = $env{'form.logtoken'}; # Check for empty data unless (defined($currentpass) && defined($newpass1) && defined($newpass2) ){ - &passwordchanger($r,"

    \nERROR". - "Password data was blank.\n

    "); + &passwordchanger($r,"

    \n". + &mt("One or more password fields were blank"). + "\n

    ",$caller,$mailtoken); return; } # Get the keys @@ -672,34 +1378,55 @@ ENDHEADER my $tmpinfo = Apache::lonnet::reply('tmpget:'.$logtoken,$lonhost); if (($tmpinfo=~/^error/) || ($tmpinfo eq 'con_lost')) { # I do not a have a better idea about how to handle this + my $tryagain_text = &mt('Please log out and try again.'); + if ($caller eq 'reset_by_email') { + $tryagain_text = &mt('Please try again later.'); + } + my $unable=&mt("Unable to retrieve saved token for password decryption"); $r->print(< -ERROR: Unable to retrieve stored token for -password decryption. Please log out and try again. +$unable. $tryagain_text

    ENDERROR # Probably should log an error here - return; + return 1; } my ($ckey,$n1key,$n2key)=split(/&/,$tmpinfo); # $currentpass = &des_decrypt($ckey ,$currentpass); $newpass1 = &des_decrypt($n1key,$newpass1); $newpass2 = &des_decrypt($n2key,$newpass2); - # + # + if ($caller eq 'reset_by_email') { + my %data = &Apache::lonnet::tmpget($mailtoken); + if (keys(%data) == 0) { + &passwordchanger($r, + ''. + &mt('Could not verify current authentication.').' '. + &mt('Please try again.').'',$caller,$mailtoken); + return 1; + } + if ($currentpass ne $data{'temppasswd'}) { + &passwordchanger($r, + ''. + &mt('Could not verify current authentication.').' '. + &mt('Please try again.').'',$caller,$mailtoken); + return 1; + } + } if ($newpass1 ne $newpass2) { &passwordchanger($r, - 'ERROR:'. - 'The new passwords you entered do not match. '. - 'Please try again.'); - return; + ''. + &mt('The new passwords you entered do not match.').' '. + &mt('Please try again.').'',$caller,$mailtoken); + return 1; } if (length($newpass1) < 7) { &passwordchanger($r, - 'ERROR:'. - 'Passwords must be a minimum of 7 characters long. '. - 'Please try again.'); - return; + ''. + &mt('Passwords must be a minimum of 7 characters long.').' '. + &mt('Please try again.').'',$caller,$mailtoken); + return 1; } # # Check for bad characters @@ -709,31 +1436,30 @@ ENDERROR } if ($badpassword) { # I can't figure out how to enter bad characters on my browser. - &passwordchanger($r,<ERROR: -The password you entered contained illegal characters.
    -Valid characters are: space and
    + my $errormessage =''. + &mt('The password you entered contained illegal characters.').'
    '. + &mt('Valid characters are').(<<"ENDERROR"); +: space and
     !"\#$%&\'()*+,-./0123456789:;<=>?\@
     ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_\`abcdefghijklmnopqrstuvwxyz{|}~
    -
    +
    ENDERROR + &passwordchanger($r,$errormessage,$caller,$mailtoken); + return 1; } # # Change the password (finally) my $result = &Apache::lonnet::changepass - ($user,$domain,$currentpass,$newpass1,$homeserver); + ($user,$domain,$currentpass,$newpass1,$homeserver,$caller); # Inform the user the password has (not?) been changed if ($result =~ /^ok$/) { - $r->print(<<"ENDTEXT"); -

    The password for $user was successfully changed

    -ENDTEXT + $r->print("

    ".&mt('The password for [_1] was successfully changed',$user)."

    "); } else { # error error: run in circles, scream and shout - $r->print(<The password for $user was not changed -Please make sure your old password was entered correctly. -ENDERROR + $r->print("

    ".&mt("The password for [_1] was not changed",$user)."

    ". + &mt('Please make sure your old password was entered correctly.')); + return 1; } return; } @@ -743,8 +1469,8 @@ ENDERROR ################################################################ sub discussionchanger { my $r = shift; - my $user = $ENV{'user.name'}; - my $domain = $ENV{'user.domain'}; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; my %userenv = &Apache::lonnet::get ('environment',['discdisplay','discmarkread']); my $discdisp = 'allposts'; @@ -766,7 +1492,7 @@ sub discussionchanger { my $function = &Apache::loncommon::get_users_function(); my $color = &Apache::loncommon::designparm($function.'.tabbg', - $ENV{'user.domain'}); + $env{'user.domain'}); my %lt = &Apache::lonlocal::texthash( 'pref' => 'Display Preference', 'curr' => 'Current setting ', @@ -802,43 +1528,41 @@ sub discussionchanger { } $r->print(<<"END"); -
    +
    -$lt{'sdpf'}
    $lt{'prca'}
    1. $lt{'whpo'}
    2. $lt{'unwh'}
    +$lt{'sdpf'}
    $lt{'prca'}
    1. $lt{'whpo'}
    2. $lt{'unwh'}


    - - - - -
    - - - - -
    - - - - - +END + $r->print(&Apache::loncommon::start_data_table()); + $r->print(<<"END"); + + + + - +END + $r->print(&Apache::loncommon::start_data_table_row()); + $r->print(<<"END"); - - + +END + $r->print(&Apache::loncommon::end_data_table_row(). + &Apache::loncommon::start_data_table_row()); + $r->print(<<"END"); - + -
    $lt{'pref'}$lt{'curr'}$lt{'actn'}?
    $lt{'pref'}$lt{'curr'}$lt{'actn'}?
    $lt{'disa'} $lt{$discdisp} $lt{'chgt'} "$dispchange"
    $lt{'npmr'} $lt{$discmark} $lt{'chgt'} "$markchange"
    -
    -
    +END + $r->print(&Apache::loncommon::end_data_table_row(). + &Apache::loncommon::end_data_table()); + $r->print(<<"END");

    - +

    Note: $lt{'thde'} @@ -848,39 +1572,117 @@ END sub verify_and_change_discussion { my $r = shift; - my $user = $ENV{'user.name'}; - my $domain = $ENV{'user.domain'}; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; my $message=''; - if (defined($ENV{'form.discdisp'}) ) { - my $newdisp = $ENV{'form.newdisp'}; + if (defined($env{'form.discdisp'}) ) { + my $newdisp = $env{'form.newdisp'}; if ($newdisp eq 'unread') { - $message .='In discussions: only new posts will be displayed.
    '; + $message .=&mt('In discussions: only new posts will be displayed.').'
    '; &Apache::lonnet::put('environment',{'discdisplay' => $newdisp}); - &Apache::lonnet::appenv('environment.discdisplay' => $newdisp); + &Apache::lonnet::appenv({'environment.discdisplay' => $newdisp}); } else { - $message .= 'In discussions: all posts will be displayed.
    '; + $message .= &mt('In discussions: all posts will be displayed.').'
    '; &Apache::lonnet::del('environment',['discdisplay']); &Apache::lonnet::delenv('environment\.discdisplay'); } } - if (defined($ENV{'form.discmark'}) ) { - my $newmark = $ENV{'form.newmark'}; + if (defined($env{'form.discmark'}) ) { + my $newmark = $env{'form.newmark'}; if ($newmark eq 'ondisp') { - $message.='In discussions: new posts will be cease to be identified as "new" after display.
    '; + $message.=&mt('In discussions: new posts will be cease to be identified as "NEW" after display.').'
    '; &Apache::lonnet::put('environment',{'discmarkread' => $newmark}); - &Apache::lonnet::appenv('environment.discmarkread' => $newmark); + &Apache::lonnet::appenv({'environment.discmarkread' => $newmark}); } else { - $message.='In discussions: posts will be identified as "new" until marked as read by the reader.
    '; + $message.=&mt('In discussions: posts will be identified as "NEW" until marked as read by the reader.').'
    '; &Apache::lonnet::del('environment',['discmarkread']); &Apache::lonnet::delenv('environment\.discmarkread'); } } $r->print(< $message ENDVCSCREEN } +################################################################ +# Subroutines for page display on course access (Course Coordinators) +################################################################ +sub coursedisplaychanger { + my $r = shift; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; + my %userenv = &Apache::lonnet::get('environment',['course_init_display']); + my $currvalue = 'whatsnew'; + my $firstselect = ''; + my $whatsnewselect = 'checked="checked"'; + if (exists($userenv{'course_init_display'})) { + if ($userenv{'course_init_display'} eq 'firstres') { + $currvalue = 'firstres'; + $firstselect = 'checked="checked"'; + $whatsnewselect = ''; + } + } + my %pagenames = ( + firstres => 'First resource', + whatsnew => "What's new page", + ); + my $whatsnew_off=&mt('Display the [_1] in the course.','first resource'); + my $whatsnew_on=&mt('Display the "[_1]" page - a summary of items in the course which require attention.',"What's New"); + + $r->print('
    '.&mt('Set the default page to be displayed when you select a course role').' '.&mt('(Currently: [_1])',$pagenames{$currvalue}).'
    '.&mt('The global user preference you set for your courses can be overridden in an individual course by setting a course specific setting via the "[_1]" page in the course',"What's New").'

    '); + $r->print(< + +
    +
    + +ENDLSCREEN + $r->print('

    +'); +} + +sub verify_and_change_coursepage { + my $r = shift; + my $message=''; + my %lt = &Apache::lonlocal::texthash( + 'defs' => 'Default now set', + 'when' => 'when you select a course role from the roles screen', + 'ywbt' => 'you will be taken to the start of the course.', + 'apwb' => 'a page will be displayed that lists items in the course that may require action from you.', + 'gtts' => 'Go to the start of the course', + 'dasp' => "Display the What's New page listing course action items", + ); + my $newdisp = $env{'form.newdisp'}; + $message = ''.$lt{'defs'}.': '.$lt{'when'}.', '; + if ($newdisp eq 'firstres') { + $message .= $lt{'ywbt'}.'
    '; + &Apache::lonnet::put('environment',{'course_init_display' => $newdisp}); + &Apache::lonnet::appenv({'environment.course_init_display' => $newdisp}); + } else { + $message .= $lt{'apwb'}.'
    '; + &Apache::lonnet::del('environment',['course_init_display']); + &Apache::lonnet::delenv('environment\.course_init_display'); + } + my $refpage = $env{'form.refpage'}; + if (($env{'request.course.fn'}) && ($env{'request.course.id'})) { + if ($newdisp eq 'firstres') { + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my ($furl,$ferr)= + &Apache::lonuserstate::readmap($cdom.'/'.$cnum); + $message .= '
    '.$lt{'gtts'}.' '.&mt('now').''; + } else { + $message .= '
    '.$lt{'dasp'}.''; + } + } + $r->print(<
    +ENDVCSCREEN +} + + ###################################################### # other handler subroutines # ###################################################### @@ -890,8 +1692,8 @@ ENDVCSCREEN ################################################################ sub handler { my $r = shift; - my $user = $ENV{'user.name'}; - my $domain = $ENV{'user.domain'}; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; &Apache::loncommon::content_type($r,'text/html'); # Some pages contain DES keys and should not be cached. &Apache::loncommon::no_cache($r); @@ -899,7 +1701,7 @@ sub handler { return OK if $r->header_only; # &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['action','wysiwyg','returnurl']); + ['action','wysiwyg','returnurl','refpage']); # &Apache::lonhtmlcommon::clear_breadcrumbs(); &Apache::lonhtmlcommon::add_breadcrumb @@ -924,7 +1726,7 @@ sub handler { breadcrumb => { href =>'/adm/preferences?action=changepass', text => 'Change Password'}, - printmenu => 'yes', + printmenu => 'not_on_error', })); } push (@Options,({ action => 'changescreenname', @@ -945,22 +1747,23 @@ sub handler { })); push (@Options,({ action => 'changemsgforward', - linktext => 'Change Message Forwarding and Notification Addresses', + linktext => 'Change Message Forwarding and Notification Email Addresses', href => '/adm/preferences', - help => 'Prefs_Forwarding', + help => 'Prefs_Messages', breadcrumb => { href => '/adm/preferences?action=changemsgforward', - text => 'Change Message Forwarding'}, + text => 'Change Message Forwarding/Notification'}, subroutine => \&msgforwardchanger, }, { action => 'verify_and_change_msgforward', + help => 'Prefs_Messages', breadcrumb => { href => '/adm/preferences?action=changemsgforward', - text => 'Change Message Forwarding'}, - printmenu => 'yes', + text => 'Change Message Forwarding/Notification'}, + printmenu => 'no', subroutine => \&verify_and_change_msgforward })); my $aboutmeaction= - '/adm/'.$ENV{'user.domain'}.'/'.$ENV{'user.name'}.'/aboutme'; + '/adm/'.$env{'user.domain'}.'/'.$env{'user.name'}.'/aboutme'; push (@Options,{ action => 'none', linktext => q{Edit the 'About Me' Personal Information Screen}, @@ -1029,41 +1832,149 @@ sub handler { printmenu => 'yes', subroutine => \&verify_and_change_discussion, } )); - + + my $role = ($env{'user.adv'} ? 'Roles' : 'Course'); push (@Options,({ action => 'changerolespref', - linktext => 'Change Roles Page Preferences', + linktext => 'Change '.$role.' Page Preferences', href => '/adm/preferences', subroutine => \&rolesprefchanger, breadcrumb => { href => '/adm/preferences?action=changerolespref', - text => 'Change Roles Pref'}, + text => 'Change '.$role.' Page Pref'}, }, { action => 'verify_and_change_rolespref', subroutine => \&verify_and_change_rolespref, breadcrumb => { href => '/adm/preferences?action=changerolespref', - text => 'Change Roles Preferences'}, + text => 'Change '.$role.' Page Preferences'}, printmenu => 'yes', })); + push (@Options,({ action => 'changetexenginepref', + linktext => 'Change How Math Equations Are Displayed', + href => '/adm/preferences', + subroutine => \&texenginechanger, + breadcrumb => + { href => '/adm/preferences?action=changetexenginepref', + text => 'Change Math Pref'}, + }, + { action => 'verify_and_change_texengine', + subroutine => \&verify_and_change_texengine, + breadcrumb => + { href => '/adm/preferences?action=changetexenginepref', + text => 'Change Math Preferences'}, + printmenu => 'yes', + })); + + if ($env{'environment.remote'} eq 'off') { + push (@Options,({ action => 'launch', + linktext => 'Launch Remote Control', + href => '/adm/remote?url=/adm/preferences', + })); + } else { + push (@Options,({ action => 'collapse', + linktext => 'Collapse Remote Control', + href => '/adm/remote?url=/adm/preferences', + })); + } + + push (@Options,({ action => 'changeicons', + linktext => 'Change How Menus are Displayed', + href => '/adm/preferences', + subroutine => \&iconchanger, + breadcrumb => + { href => '/adm/preferences?action=changeicons', + text => 'Change Main Menu'}, + }, + { action => 'verify_and_change_icons', + subroutine => \&verify_and_change_icons, + breadcrumb => + { href => '/adm/preferences?action=changeicons', + text => 'Change Main Menu'}, + printmenu => 'yes', + })); + + push (@Options,({ action => 'changeclicker', + linktext => 'Register Response Devices ("Clickers")', + href => '/adm/preferences', + subroutine => \&clickerchanger, + breadcrumb => + { href => '/adm/preferences?action=changeclicker', + text => 'Register Clicker'}, + }, + { action => 'verify_and_change_clicker', + subroutine => \&verify_and_change_clicker, + breadcrumb => + { href => '/adm/preferences?action=changeclicker', + text => 'Register Clicker'}, + printmenu => 'yes', + })); + if ($env{'user.adv'}) { + push (@Options,({ action => 'changedomcoord', + linktext => 'Restrict Domain Coordinator Access', + href => '/adm/preferences', + subroutine => \&domcoordchanger, + breadcrumb => + { href => '/adm/preferences?action=changedomcoord', + text => 'Restrict Domain Coordinator Access'}, + }, + { action => 'verify_and_change_domcoord', + subroutine => \&verify_and_change_domcoord, + breadcrumb => + { href => '/adm/preferences?action=changedomcoord', + text => 'Restrict Domain Coordinator Access'}, + printmenu => 'yes', + })); + } - if ($ENV{'user.name'} =~ /^(albertel|koretemey|korte|hallmat3|turtle)$/) { + push (@Options,({ action => 'lockwarning', + subroutine => \&lockwarning, + breadcrumb => + { href => '/adm/preferences?action=lockwarning', + text => 'Lock Warnings'}, + }, + { action => 'verify_and_change_locks', + subroutine => \&verify_and_change_lockwarning, + breadcrumb => + { href => '/adm/preferences?action=lockwarning', + text => 'Lockwarnings'}, + printmenu => 'yes', + })); + + + if (&Apache::lonnet::allowed('whn',$env{'request.course.id'}) + || &Apache::lonnet::allowed('whn',$env{'request.course.id'}.'/' + .$env{'request.course.sec'})) { + push (@Options,({ action => 'changecourseinit', + linktext => 'Change Course Initialization Preference', + href => '/adm/preferences', + subroutine => \&coursedisplaychanger, + breadcrumb => + { href => '/adm/preferences?action=changecourseinit', + text => 'Change Course Init. Pref.'}, + }, + { action => 'verify_and_change_coursepage', + breadcrumb => + { href => '/adm/preferences?action=changecourseinit', text => 'Change Course Initialization Preference'}, + printmenu => 'yes', + subroutine => \&verify_and_change_coursepage, + })); + } + + if ($env{'user.name'} =~ /^(albertel|fox|foxr|kortemey|korte|raeburn)$/) { push (@Options,({ action => 'debugtoggle', printmenu => 'yes', subroutine => \&toggle_debug, })); } - $r->print(< - -LON-CAPA Preferences - -ENDHEADER + + $r->print(&Apache::loncommon::start_page('Change Preferences')); + my $call = undef; my $help = undef; my $printmenu = 'yes'; foreach my $option (@Options) { - if ($option->{'action'} eq $ENV{'form.action'}) { + if ($option->{'action'} eq $env{'form.action'}) { $call = $option->{'subroutine'}; $printmenu = $option->{'printmenu'}; if (exists($option->{'breadcrumb'})) { @@ -1073,21 +1984,22 @@ ENDHEADER $help=$option->{'help'}; } } - $r->print(&Apache::loncommon::bodytag('Change Preferences')); - $r->print(&Apache::lonhtmlcommon::breadcrumbs - (undef,'Change Preferences',$help)); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Change Preferences',$help)); + my $error; if (defined($call)) { - $call->($r); + $error = $call->($r); } - if (($printmenu eq 'yes') && (!$ENV{'form.returnurl'})) { + if ( ( ($printmenu eq 'yes') + || ($printmenu eq 'not_on_error' && !$error) ) + && (!$env{'form.returnurl'})) { my $optionlist = ''; - if ($ENV{'user.name'} =~ - /^(albertel|kortemey|korte|hallmat3|turtle)$/ + if ($env{'user.name'} =~ + /^(albertel|kortemey|fox|foxr|korte|hallmat3|turtle|raeburn)$/ ) { push (@Options,({ action => 'debugtoggle', linktext => 'Toggle Debug Messages', text => 'Current Debug status is -'. - $ENV{'user.debug'}.'-.', + $env{'user.debug'}.'-.', href => '/adm/preferences', printmenu => 'yes', subroutine => \&toggle_debug, @@ -1096,9 +2008,10 @@ ENDHEADER foreach my $option(@Options) { my $optiontext = ''; if (exists($option->{'href'})) { - $optiontext .= - ''. + $option->{'href_args'}{'action'}=$option->{'action'}; + $optiontext .= + ''. &mt($option->{'linktext'}).''; } if (exists($option->{'text'})) { @@ -1119,22 +2032,19 @@ ENDHEADER } $optionlist .= '
    '; $r->print($optionlist); - } elsif ($ENV{'form.returnurl'}) { - $r->print('
    '. + } elsif ($env{'form.returnurl'}) { + $r->print('
    '. &mt('Return').''); } - $r->print(< - -ENDFOOTER + $r->print(&Apache::loncommon::end_page()); return OK; } sub toggle_debug { - if ($ENV{'user.debug'}) { + if ($env{'user.debug'}) { &Apache::lonnet::delenv('user\.debug'); } else { - &Apache::lonnet::appenv('user.debug' => 1); + &Apache::lonnet::appenv({'user.debug' => 1}); } }