--- loncom/interface/lonpreferences.pm 2005/04/07 06:56:23 1.59 +++ loncom/interface/lonpreferences.pm 2012/05/10 18:00:24 1.196.4.1 @@ -1,7 +1,7 @@ # The LearningOnline Network # Preferences # -# $Id: lonpreferences.pm,v 1.59 2005/04/07 06:56:23 albertel Exp $ +# $Id: lonpreferences.pm,v 1.196.4.1 2012/05/10 18:00:24 raeburn 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; @@ -41,6 +42,8 @@ use Apache::loncommon(); use Apache::lonhtmlcommon(); use Apache::lonlocal; use Apache::lonnet; +use LONCAPA::lonauthcgi(); +use LONCAPA(); # # Write lonnet::passwd to do the call below. @@ -96,24 +99,35 @@ sub des_decrypt { sub wysiwygchanger { my $r = shift; + Apache::lonhtmlcommon::add_breadcrumb( + { href => '/adm/preferences?action=changewysiwyg', + text => 'Change WYSIWYG Preferences'}); + $r->print(Apache::loncommon::start_page('Content Display Settings')); + $r->print(Apache::lonhtmlcommon::breadcrumbs('Change WYSIWYG Preferences')); + 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'); + my $warning=''; + if ($env{'user.adv'}) { + $warning.='

'.&mt("The WYSIWYG editor only supports simple HTML and is in many cases unsuited for advanced authoring. In a number of cases, it may destroy advanced authoring involving LaTeX and script function calls.")."

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

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

'); + &Apache::lonnet::appenv({'environment.wysiwygeditor' => $newsetting}); + my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]',''.&mt('WYSIWYG Editor').'',''.&mt($newsetting).'')); + $message=&Apache::loncommon::confirmwrapper($message); + &print_main_menu($r,$message); } ################################################################ @@ -130,6 +146,12 @@ sub verify_and_change_wysiwyg { ################################################################ sub languagechanger { my $r = shift; + + Apache::lonhtmlcommon::add_breadcrumb( + { href => '/adm/preferences?action=changelanguages', + text => 'Change Language'}); + $r->print(Apache::loncommon::start_page('Content Display Settings')); + $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Language')); my $user = $env{'user.name'}; my $domain = $env{'user.domain'}; my %userenv = &Apache::lonnet::get @@ -144,14 +166,18 @@ sub languagechanger { = &Apache::loncommon::plainlanguagedescription($_); } } - my $selectionbox=&Apache::loncommon::select_form($language,'language', - %langchoices); + %langchoices = &Apache::lonlocal::texthash(%langchoices); + my $selectionbox= + &Apache::loncommon::select_form( + $language, + 'language', + \%langchoices); $r->print(< +
$pref: $selectionbox ENDLSCREEN - $r->print('
'); + $r->print('
'); } @@ -165,16 +191,21 @@ sub verify_and_change_languages { 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=&Apache::lonhtmlcommon::confirm_success( + &mt('Set [_1] to [_2]', + ''.&mt('Preferred language').'', + '"'.$newlanguage.'".')) + .'
' + .&mt('The change will become active on the next page.'); } else { &Apache::lonnet::del('environment',['languages']); - &Apache::lonnet::delenv('environment\.languages'); - $message='Reset preferred language'; + &Apache::lonnet::delenv('environment.languages'); + $message=&Apache::lonhtmlcommon::confirm_success(&mt('Reset [_1]',''.&mt('Preferred language').'')); } - $r->print(< '/adm/preferences?action=changetexenginepref', + text => 'Math display settings'}); + $r->print(Apache::loncommon::start_page('Content Display Settings')); + $r->print(Apache::lonhtmlcommon::breadcrumbs('Math display settings')); my $user = $env{'user.name'}; my $domain = $env{'user.domain'}; my %userenv = &Apache::lonnet::get('environment',['texengine']); my $texengine=$userenv{'texengine'}; - my $pref=&mt('Preferred method to display Math'); - my %mathchoices=('' => 'No Preference', - 'tth' => 'TeX to HTML', - 'ttm' => 'TeX to MathML', + my %mathchoices=('' => 'Default', + 'tth' => 'tth (TeX to HTML)', + #'ttm' => 'TeX to MathML', 'jsMath' => 'jsMath', - 'mimetex' => 'Convert to Images' + 'mimetex' => 'mimetex (Convert to Images)', + 'raw' => 'Raw (Screen Reader)' ); - my $selectionbox=&Apache::loncommon::select_form($texengine,'texengine', - %mathchoices); - my $mathexample='$$\int\left(\frac{a+b}{c^6*d}\right)$$'; - my $jsMath_example=&Apache::lontexconvert::jsMath_converted(\$mathexample); - $mathexample='$$\int\left(\frac{a+b}{c^6*d}\right)$$'; - my $tth_example=&Apache::lontexconvert::tth_converted(\$mathexample); - $mathexample='$$\int\left(\frac{a+b}{c^6*d}\right)$$'; - my $mimetex_example=&Apache::lontexconvert::mimetex_converted(\$mathexample); - my $change=&mt('Change'); + %mathchoices = &Apache::lonlocal::texthash(%mathchoices); + my $selectionbox= + &Apache::loncommon::select_form( + $texengine, + 'texengine', + \%mathchoices); + my $jsMath_start=&Apache::lontexconvert::jsMath_header(); + my %lt=&Apache::lonlocal::texthash( + 'headline' => 'Change how math is displayed', + 'preftxt' => 'Preferred method to display math', + 'change' => 'Save', + 'exmpl' => 'Examples', + 'jsmath' => 'jsMath:', + 'tth' => 'tth (TeX to HTML):', + 'mimetex' => 'mimetex (Convert to Images):', + ); + + my $jsMathWarning='

' + .'

' + .&mt("It looks like you don't have the TeX math fonts installed.") + .'
' + .'
' + .&mt('The jsMath example on this page may not look right without them. ' + .'The [_1]jsMath Home Page[_2] has information on how to download the ' + .'needed fonts. In the meantime, jsMath will do the best it can ' + .'with the fonts you have, but it may not be pretty and some equations ' + .'may not be rendered correctly.' + ,'' + ,'') + .'
' + .'

'; + $r->print(< +

$lt{'headline'}

+ -

$pref: $selectionbox

-

+

+$lt{'preftxt'}: $selectionbox +
+ +

-Examples: -

TeX to HTML
$tth_example

- - -

jsMath
+
+


+$lt{'exmpl'} - + +

+ +

$lt{'mimetex'}

+

+ +

-$jsMath_example

-

Convert to Images
$mimetex_example

+

$lt{'tth'}

+

+ +

ENDLSCREEN if ($env{'environment.texengine'} ne 'jsMath') { - $r->print(''); + $r->print(''); } } @@ -249,27 +312,24 @@ sub verify_and_change_texengine { my $newtexengine = $env{'form.texengine'}; $newtexengine=~s/[^\-\w]//g; if ($newtexengine eq 'ttm') { - &Apache::lonnet::appenv('browser.mathml' => 1); + &Apache::lonnet::appenv({'browser.mathml' => 1}); } else { if ($env{'environment.texengine'} eq 'ttm') { - &Apache::lonnet::appenv('browser.mathml' => 0); + &Apache::lonnet::appenv({'browser.mathml' => 0}); } } my $message=''; if ($newtexengine) { &Apache::lonnet::put('environment',{'texengine' => $newtexengine}); - &Apache::lonnet::appenv('environment.texengine' => $newtexengine); - $message='Set new preferred math display to '.$newtexengine; + &Apache::lonnet::appenv({'environment.texengine' => $newtexengine}); + $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]',''.&mt('Preferred method to display Math').'','"'.$newtexengine.'"')); } else { &Apache::lonnet::del('environment',['texengine']); - &Apache::lonnet::delenv('environment\.texengine'); - $message='Reset preferred math display.'; + &Apache::lonnet::delenv('environment.texengine'); + $message=&Apache::lonhtmlcommon::confirm_success(&mt('Reset [_1]',''.&mt('Preferred method to display Math').'')); } - - - $r->print(< '/adm/preferences?action=changerolespref', + text => 'Change '.$role.' Page Pref'}); + $r->print(Apache::loncommon::start_page('Content Display Settings')); + $r->print(Apache::lonhtmlcommon::breadcrumbs('Change '.$role.' Page Pref')); my $hotlist_flag=$userenv{'recentroles'}; my $hotlist_n=$userenv{'recentrolesn'}; my $checked; @@ -296,55 +363,158 @@ sub rolesprefchanger { $options .= "\n"; } - $r->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('Recent '.$role.'s Hotlist').'

'. +&Apache::lonhtmlcommon::start_pick_box(). +&Apache::lonhtmlcommon::row_title(''). +''. +&Apache::lonhtmlcommon::row_closure(). +&Apache::lonhtmlcommon::row_title(''). +''. +&Apache::lonhtmlcommon::row_closure(1). +&Apache::lonhtmlcommon::end_pick_box(). +'

'.&mt('Freeze Roles').'

'. +'

'.&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 $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 $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=&Apache::lonhtmlcommon::confirm_success(&mt('Recent '.$role.'s Hotlist is Enabled.')." ".&mt('Display [_1] Most Recent '.$role.'s.',$hotlist_n)); } else { &Apache::lonnet::del('environment',['recentroles']); - &Apache::lonnet::delenv('environment\.recentroles'); - $message='Recent Roles Hotlist is Disabled'; + &Apache::lonnet::delenv('environment.recentroles'); + $message=&Apache::lonhtmlcommon::confirm_success(&mt('Recent '.$role.'s Hotlist is Disabled')); } if ($hotlist_n) { &Apache::lonnet::put('environment',{'recentrolesn' => $hotlist_n}); - &Apache::lonnet::appenv('environment.recentrolesn' => $hotlist_n); - if ($hotlist_flag) { - $message.="
Display $hotlist_n Most Recent Roles\n"; + &Apache::lonnet::appenv({'environment.recentrolesn' => $hotlist_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 .= "
".&Apache::lonhtmlcommon::confirm_success(&mt('Unfreezing '.$role.': [_1]',''.$role_text{$role_key}.'')); + &Apache::lonhtmlcommon::store_recent('roles',$role_key,' ',0); } } - $r->print(<'.$role_text{$role_key}.'')); + &Apache::lonhtmlcommon::store_recent('roles', + $role_key,' ',1); + } + } + $message=&Apache::loncommon::confirmwrapper($message); + &print_main_menu($r, $message); } @@ -360,16 +530,30 @@ sub screennamechanger { ('environment',['screenname','nickname']); my $screenname=$userenv{'screenname'}; my $nickname=$userenv{'nickname'}; - $r->print(< - -
New screenname (shown if you post anonymously): - -
New nickname (shown if you post non-anonymously): - - - -ENDSCREEN + Apache::lonhtmlcommon::add_breadcrumb( + { href => '/adm/preferences?action=changescreenname', + text => 'Change Screen Name'}); + $r->print(Apache::loncommon::start_page('Personal Data')); + $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Screen Name')); + $r->print('

' + .&mt('Change the name that is displayed in your posts.') + .'

' + ); + $r->print('
' + .'' + .&Apache::lonhtmlcommon::start_pick_box() + .&Apache::lonhtmlcommon::row_title(&mt('Screenname').' '.&mt('(shown if you post anonymously)')) + .'' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title(&mt('Nickname').' '.&mt('(shown if you post non-anonymously)')) + .'' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title() + .'' + .&Apache::lonhtmlcommon::row_closure(1) + .&Apache::lonhtmlcommon::end_pick_box() + .'
' + ); } sub verify_and_change_screenname { @@ -382,12 +566,12 @@ sub verify_and_change_screenname { 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=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]',''.&mt('Screenname').'','"'.$newscreen.'"')); } else { &Apache::lonnet::del('environment',['screenname']); - &Apache::lonnet::delenv('environment\.screenname'); - $message='Reset screenname'; + &Apache::lonnet::delenv('environment.screenname'); + $message=&Apache::lonhtmlcommon::confirm_success(&mt('Reset [_1]',''.&mt('Screenname').'')); } # Nickname $message.='
'; @@ -395,51 +579,471 @@ sub verify_and_change_screenname { $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.=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]',''.&mt('Nickname').'','"'.$newscreen.'"')); } else { &Apache::lonnet::del('environment',['nickname']); - &Apache::lonnet::delenv('environment\.nickname'); - $message.='Reset nickname'; + &Apache::lonnet::delenv('environment.nickname'); + $message.=&Apache::lonhtmlcommon::confirm_success(&mt('Reset [_1]',''.&mt('Nickname').'')); } + &Apache::lonnet::devalidate_cache_new('namescache',$user.':'.$domain); + $message=&Apache::loncommon::confirmwrapper($message); + &print_main_menu($r, $message); +} - $r->print(< '/adm/preferences?action=changeicons', + text => 'Change Menu Display'}); + $r->print(Apache::loncommon::start_page('Page Display Settings')); + $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Menu Display')); + + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; + my %userenv = &Apache::lonnet::get('environment',['icons']); + my $iconic='checked="checked"'; + my ($classic,$onlyicon,$iconic_preview,$iconsonly_preview); + if ($userenv{'icons'} eq 'classic') { + $iconic=''; + $classic='
'. + &mt('Your current selection: "Use buttons and text" is deprecated - it is recommended that you change this to "Use icons and text".').'
'; + } + if ($userenv{'icons'} eq 'iconsonly') { + $onlyicon='checked="checked"'; + $iconic=''; + } + my $change=&mt('Save'); + my %lt = &icon_options(); + my ($inlinetools,$toolsorder) = &icon_previews(); + if ((ref($inlinetools) eq 'HASH') && (ref($toolsorder) eq 'ARRAY')) { + foreach my $tool (@{$toolsorder}) { + my ($command,$row,$col,$img,$top,$bot,$act,$desc) = + split(/\&/,$inlinetools->{$tool}); + $iconic_preview .= '
  • '.$desc.''.$top.(' ' x 2).'
  • '; + $iconsonly_preview .= '
  • '.$desc.' 
  • '; + } + } + $iconsonly_preview = '
    • '. + '
        '. + $iconsonly_preview. + '
    '; + $iconic_preview = '
    • '. + '
        '. + $iconic_preview. + '
    '; + $r->print(< + +$iconic_preview
    +$iconsonly_preview
    + + +ENDSCREEN +} + +sub verify_and_change_icons { + my $r = shift; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; + my $newicons = $env{'form.menumode'}; + my %lt = &icon_options(); + my $newchoice = $newicons; + if ($lt{$newicons}) { + $newchoice = $lt{$newicons}; + } + &Apache::lonnet::put('environment',{'icons' => $newicons}); + &Apache::lonnet::appenv({'environment.icons' => $newicons}); + my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]',''.&mt('Menu Display').'',''.$newchoice.'')); + $message=&Apache::loncommon::confirmwrapper($message); + &print_main_menu($r, $message); +} + +sub icon_options { + return &Apache::lonlocal::texthash( + iconic => 'Use icons and text', + iconsonly => 'Use icons only', + ); +} + +sub icon_previews { + my %icon_text = ( + annotate => 'Notes', + wishlist => 'Wishlist', + catalog => 'Info', + evaluate => 'Evaluate', + feedback => 'Communicate', + printout => 'Print', + ); + my %inlinetools = ( + printout => "s&8&3&prt.png&$icon_text{'printout'}&printout[_1]&gopost('/adm/printout',currentURL)&Prepare a printable document", + wishlist => "s&9&1&wishlist-link.png&$icon_text{'wishlist'}&wishlistlink[_2]&set_wishlistlink()&Set a link for this resource to wishlist", + evaluate => "s&8&1&eval.png&$icon_text{'evaluate'}&this[_1]&gopost('/adm/evaluate',currentURL,1)&Provide my evaluation of this resource", + feedback => "s&8&2&fdbk.png&$icon_text{'feedback'}&discuss[_1]&gopost('/adm/feedback',currentURL,1)&Provide feedback messages or contribute to the course discussion about this resource", + annotate => "s&9&3&anot.png&$icon_text{'annotate'}&tations[_1]&annotate()&Make notes and annotations about this resource", + catalog => "s&6&3&catalog.png&$icon_text{'catalog'}&info[_1]&catalog_info()&Show Metadata", + ); + my @toolsorder = qw(annotate wishlist evaluate feedback printout catalog); + return (\%inlinetools,\@toolsorder); +} + +################################################################ +# Clicker Subroutines # +################################################################ + +sub clickerchanger { + my $r = shift; + &Apache::lonhtmlcommon::add_breadcrumb( + { href => '/adm/preferences?action=changeclicker', + text => 'Register Clicker'}); + $r->print(Apache::loncommon::start_page('Other')); + $r->print(Apache::lonhtmlcommon::breadcrumbs('Register Clicker')); + 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('Save'); + 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}); + my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Registering clickers: [_1]',$newclickers)); + $message=&Apache::loncommon::confirmwrapper($message); + &print_main_menu($r, $message); } ################################################################ +# Domcoord Access Subroutines # +################################################################ + +sub domcoordchanger { + my $r = shift; + &Apache::lonhtmlcommon::add_breadcrumb( + { href => '/adm/preferences?action=changedomcoord', + text => 'Restrict Domain Coordinator Access'}); + $r->print(Apache::loncommon::start_page('Restrict Domain Coordinator Access')); + $r->print(Apache::lonhtmlcommon::breadcrumbs('Restrict Domain Coordinator Access')); + 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('Save'); + $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'}}); + my $status=''; + if ($domcoord{'domcoord.author'} eq 'blocked') { + $status=&mt('on'); + } else { + $status=&mt('off'); + } + my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]',''.&mt('Block access to construction space').'',''.$status.'')); + $message=&Apache::loncommon::confirmwrapper($message); + &print_main_menu($r,$message); +} + +################################################################# +## 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 ($r,$message) = @_; my $user = $env{'user.name'}; my $domain = $env{'user.domain'}; - my %userenv = &Apache::lonnet::get('environment',['msgforward','notification','critnotification']); + 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 => 'Forward to account(s)', + fwdm => 'Forward messages to other account(s) in LON-CAPA', + noti => 'E-mail notification of LON-CAPA messages', + foad_exmpl => 'e.g. userA:domain1,userB:domain2,...', + mnot => 'E-mail address(es) which should be notified about new LON-CAPA messages', + mnot_exmpl => 'e.g. joe@doe.com', + chg => 'Save', + 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', + ); + Apache::lonhtmlcommon::add_breadcrumb( + { href => '/adm/preferences?action=changemsgforward', + text => 'Messages & Notifications'}); + $r->print(Apache::loncommon::start_page('Messages & Notifications')); + $r->print(Apache::lonhtmlcommon::breadcrumbs('Messages & Notifications')); + 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{'fwdm'} $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 .= ''.(' ' x4); + } + my $htmlon = ''; + my $htmloff = ''; + if (grep/^\Q$item\E/,@allow_html) { + $htmlon = 'checked="checked" '; + } else { + $htmloff = 'checked="checked" '; + } + $output .= ''.(' ' x3). + ''. + &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 .= ''.(' ' x4); + } + $output .= ''.(' ' x3). + ''. + &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 { @@ -448,53 +1052,103 @@ sub verify_and_change_msgforward { my $domain = $env{'user.domain'}; my $newscreen = ''; my $message=''; - foreach (split(/\,/,$env{'form.msgforward'})) { - my ($msuser,$msdomain)=split(/[\@\:]/,$_); - $msuser=~s/\W//g; - $msdomain=~s/\W//g; + foreach my $recip (split(/\,/,$env{'form.msgforward'})) { + my ($msuser,$msdomain); + if ($recip =~ /:/) { + ($msuser,$msdomain)=split(':',$recip); + } else { + ($msuser,$msdomain)=split(/\@/,$recip); + } + $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.'
    '; - } + $newscreen.=$msuser.':'.$msdomain.','; + } else { + $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 .= &Apache::lonhtmlcommon::confirm_success(&mt('Set message forwarding to ').'"'.$newscreen.'".
    '); } else { &Apache::lonnet::del('environment',['msgforward']); - &Apache::lonnet::delenv('environment\.msgforward'); - $message.='Reset message forwarding
    '; + &Apache::lonnet::delenv('environment.msgforward'); + $message.= &Apache::lonhtmlcommon::confirm_success(&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.=&Apache::lonhtmlcommon::confirm_success(&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
    '; + &Apache::lonnet::delenv('environment.notification'); + $message.=&Apache::lonhtmlcommon::confirm_success(&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.=&Apache::lonhtmlcommon::confirm_success(&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
    '; + &Apache::lonnet::delenv('environment.critnotification'); + $message.=&Apache::lonhtmlcommon::confirm_success(&mt("Set critical message notification to 'off'.").'
    '); } - $r->print(< $notify_with_html}); + &Apache::lonnet::appenv({'environment.notifywithhtml' => $notify_with_html}); + $message.=&Apache::lonhtmlcommon::confirm_success(&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.=&Apache::lonhtmlcommon::confirm_success(&mt("Set notification address to receive excerpts with html stripped.")); + } else { + $message.=&Apache::lonhtmlcommon::confirm_success(&mt("Set all notification addresses to receive excerpts with html stripped.")); + } + } + } else { + &Apache::lonnet::del('environment',['notifywithhtml']); + &Apache::lonnet::delenv('environment.notifywithhtml'); + } + &Apache::loncommon::flush_email_cache($user,$domain); + $message=&Apache::loncommon::confirmwrapper($message); + &msgforwardchanger($r,$message); } ################################################################ @@ -503,53 +1157,52 @@ ENDVCMSG sub colorschanger { my $r = shift; + Apache::lonhtmlcommon::add_breadcrumb( + { href => '/adm/preferences?action=changecolors', + text => 'Change Colors'}); + $r->print(Apache::loncommon::start_page('Page Display Settings')); + $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Colors')); # 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', - 'sidebg'=> 'Header Border', - 'font' => 'Font', - 'link' => 'Un-Visited Link', - 'vlink' => 'Visited Link', - 'alink' => 'Active Link'); + my %colortypes=&Apache::lonlocal::texthash( + 'pgbg' => 'Page Background Color', + 'tabbg' => 'Header Background Color', + 'sidebg' => 'Header Border Color', + 'font' => 'Font Color', + 'fontmenu' => 'Font Menu Color', + 'link' => 'Un-Visited Link Color', + 'vlink' => 'Visited Link Color', + 'alink' => 'Active Link Color', + ); + 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'".');">'.&mt('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(); + my $savebutton = &mt('Save'); + my $resetbutton = &mt('Reset All'); + my $resetbuttondesc = &mt('Reset All Colors to Default'); $r->print(< - - function pclose() { - parmwin=window.open("/adm/rat/empty.html","LONCAPAparms", - "height=350,width=350,scrollbars=no,menubar=no"); - parmwin.close(); - } + -$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' => 'Save', + ); + + my $output = '

    ' + .&Apache::lonhtmlcommon::start_pick_box(); + if ($caller eq 'reset_by_email') { + $output .= &Apache::lonhtmlcommon::row_title( + '') + .'' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title( + '') + .'' + .'' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title( + '') + .&Apache::loncommon::select_dom_form($defdom,'udom') + .&Apache::lonhtmlcommon::row_closure(); + } else { + $output .= &Apache::lonhtmlcommon::row_title( + '') + .'' + .&Apache::lonhtmlcommon::row_closure(); + } + $output .= &Apache::lonhtmlcommon::row_title( + '') + .'' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title( + '') + .'' + .&Apache::lonhtmlcommon::row_closure(1) + .&Apache::lonhtmlcommon::end_pick_box(); + $output .= '

    ' + .qq| + + + + + + +
    +

    +|; + 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| + + + + -
    - - - - - - - -
    Current password:
    New password:
    Confirm password:
    - -
    - - - - - - +|; + } + $output .= qq| +
    -

    -ENDFORM - # - return; +|; + 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):/); - # - my $html=&Apache::lonxml::xmlbegin(); - $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'}; @@ -756,8 +1545,9 @@ ENDHEADER 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 @@ -765,34 +1555,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 @@ -802,31 +1613,46 @@ 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 + my $message; if ($result =~ /^ok$/) { - $r->print(<<"ENDTEXT"); -

    The password for $user was successfully changed

    -ENDTEXT + $message = &Apache::lonhtmlcommon::confirm_success(&mt('The password for user [_1] was successfully changed.',''.$user.'')); + $message = &Apache::loncommon::confirmwrapper($message); + if ($caller eq 'reset_by_email') { + $r->print($message.'
    '); + } else { + &print_main_menu($r, $message); + } } 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 + if ($caller eq 'reset_by_email') { + if (!$result) { + return 1; + } else { + return $result; + } + } else { + $message = &Apache::lonhtmlcommon::confirm_success( + &mt("The password for user [_1] was not changed.",''.$user.'').' '.&mt('Please make sure your old password was entered correctly.'),1); + $message=&Apache::loncommon::confirmwrapper($message); + &print_main_menu($r, $message); + } } return; } @@ -836,6 +1662,11 @@ ENDERROR ################################################################ sub discussionchanger { my $r = shift; + Apache::lonhtmlcommon::add_breadcrumb( + { href => '/adm/preferences?action=changediscussions', + text => 'Change Discussion Preferences'}); + $r->print(Apache::loncommon::start_page('Change Discussion Preferences')); + $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Discussion Preferences')); my $user = $env{'user.name'}; my $domain = $env{'user.domain'}; my %userenv = &Apache::lonnet::get @@ -849,7 +1680,7 @@ sub discussionchanger { } } if (defined($userenv{'discmarkread'})) { - unless ($userenv{'discdisplay'} eq '') { + unless ($userenv{'discmarkread'} eq '') { $discmark = $userenv{'discmarkread'}; } } @@ -864,16 +1695,16 @@ sub discussionchanger { 'pref' => 'Display Preference', 'curr' => 'Current setting ', 'actn' => 'Action', - 'sdpf' => 'Set display preferences for discussion posts for both bulletin boards and individual resources in all your courses.', + 'sdpf' => 'Set display preferences for discussion posts for both discussion boards and individual resources in all your courses.', 'prca' => 'Preferences can be set that determine', - 'whpo' => 'Which posts are displayed when you display a bulletin board or resource, and', - 'unwh' => 'Under what circumstances posts are identfied as "New"', + 'whpo' => 'Which posts are displayed when you display a discussion board or resource, and', + 'unwh' => 'Under what circumstances posts are identified as "NEW"', 'allposts' => 'All posts', 'unread' => 'New posts only', 'ondisp' => 'Once displayed', - 'onmark' => 'Once marked as read', + 'onmark' => 'Once marked not NEW', 'disa' => 'Posts displayed?', - 'npmr' => 'New posts cease to be identified as "New"?', + 'npmr' => 'New posts cease to be identified as "NEW"?', 'thde' => 'The preferences you set here can be overridden within each individual discussion.', 'chgt' => 'Change to ' ); @@ -893,50 +1724,45 @@ sub discussionchanger { $currmark = $lt{'ondisp'}; $newmark = 'onmark'; } - + $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('

    '.$lt{'thde'}.'

    '); + + $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"
    -
    -
    -
    -
    - -
    -
    -Note: $lt{'thde'} -
    END + $r->print(&Apache::loncommon::end_data_table_row(). + &Apache::loncommon::end_data_table()); + + $r->print('
    ' + .'' + .'' + ); } sub verify_and_change_discussion { @@ -947,30 +1773,377 @@ sub verify_and_change_discussion { if (defined($env{'form.discdisp'}) ) { my $newdisp = $env{'form.newdisp'}; if ($newdisp eq 'unread') { - $message .='In discussions: only new posts will be displayed.
    '; + $message .=&Apache::lonhtmlcommon::confirm_success(&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 .= &Apache::lonhtmlcommon::confirm_success(&mt('In discussions: all posts will be displayed.')).'
    '; &Apache::lonnet::del('environment',['discdisplay']); - &Apache::lonnet::delenv('environment\.discdisplay'); + &Apache::lonnet::delenv('environment.discdisplay'); } } 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.=&Apache::lonhtmlcommon::confirm_success(&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.=&Apache::lonhtmlcommon::confirm_success(&mt('In discussions: posts will be identified as "NEW" until marked as not "NEW".')).'
    '; &Apache::lonnet::del('environment',['discmarkread']); - &Apache::lonnet::delenv('environment\.discmarkread'); + &Apache::lonnet::delenv('environment.discmarkread'); } } - $r->print(< '/adm/preferences?action=changecourseinit', + text => 'Change Course Init. Pref.'}); + $r->print(Apache::loncommon::start_page('Change Course Initialization Preference')); + $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Course Init. Pref.')); + 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 = &Apache::lonlocal::texthash( + firstres => 'First resource', + whatsnew => "What's New Page", + ); + my $whatsnew_off=&mt('Display the [_1]first resource[_2] in the course.','',''); + my $whatsnew_on=&mt("Display the [_1]What's New Page[_2] - a summary of items in the course which require attention.",'',''); + + $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]What's New Page[_2] in the course.",'','') + .'

    ' + ); + $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", + ); + 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'}.''; + } + } + $message = &Apache::lonhtmlcommon::confirm_success($message); + $message = &Apache::loncommon::confirmwrapper($message); + &print_main_menu($r,$message); +} + +sub lockednameschanger { + my $r = shift; + &Apache::lonhtmlcommon::add_breadcrumb( + { href => '/adm/preferences?action=changelockednames', + text => 'Automatic name changes'}); + $r->print(Apache::loncommon::start_page('Automatic name changes')); + $r->print(Apache::lonhtmlcommon::breadcrumbs('Allow/disallow name updates')); + my %userenv = &Apache::lonnet::get('environment',['lockedname']); + my $lockedname=''; + if (&can_toggle_namelocking()) { + if ($userenv{'lockedname'}) { + $lockedname = ' checked="checked"'; + } + my %updateable; + my %domconfig = + &Apache::lonnet::get_dom('configuration',['autoupdate'],$env{'user.domain'}); + if (ref($domconfig{'autoupdate'}) eq 'HASH') { + if ($domconfig{'autoupdate'}{'run'}) { + my @inststatuses = split(':',$env{'environment.inststatus'}); + unless (@inststatuses) { + @inststatuses = ('default'); + } + %updateable = &updateable_userinfo($domconfig{'autoupdate'},\@inststatuses); + } + } + if (keys(%updateable)) { + my %longnames = &Apache::lonlocal::texthash ( + firstname => 'First Name', + middlename => 'Middle Name', + lastname => 'Last Name', + ); + my $text=&mt('By default, based on your institutional affiliation, your LON-CAPA account can be automatically updated nightly based on directory information from your institution.').'
    '.&mt('The following may be updated, unless you disallow updates:'). + '
      '; + foreach my $item ('firstname','middlename','lastname') { + if ($updateable{$item}) { + $text .= '
    • '.$longnames{$item}.'
    • '; + } + } + $text .= '
    '; + my $locking=&mt('Disallow automatic updates to name information for your LON-CAPA account'); + my $change=&mt('Save'); + $r->print(< + +$text
    +
    + + +ENDSCREEN + } else { + my $message = &mt('Based on your institutional affiliation no name information is automatically updated for your LON-CAPA account.'); + &print_main_menu($r,$message); + } + } else { + my $message = &mt('You are not permitted to set a user preference for automatic name updates for your LON-CAPA account.'); + &print_main_menu($r,$message); + } +} + +sub verify_and_change_lockednames { + my $r = shift; + my $message; + if (&can_toggle_namelocking()) { + my $newlockedname = $env{'form.lockednames'}; + $newlockedname =~ s/\D//g; + my $currlockedname = $env{'environment.lockedname'}; + if ($newlockedname ne $currlockedname) { + if ($newlockedname) { + if (&Apache::lonnet::put('environment',{lockedname => $newlockedname}) eq 'ok') { + &Apache::lonnet::appenv({'environment.lockedname' => $newlockedname}); + } + } elsif (&Apache::lonnet::del('environment',['lockedname']) eq 'ok') { + &Apache::lonnet::delenv('environment.lockedname'); + } + } + my $status=''; + if ($newlockedname) { + $status=&mt('disallowed'); + } else { + $status=&mt('allowed'); + } + $message=&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]',''.&mt('Automatic update of first, middle and last names if institutional directory information indicates changes').'',''.$status.'')); + $message=&Apache::loncommon::confirmwrapper($message); + } + &print_main_menu($r,$message); +} + +sub print_main_menu { + my ($r, $message) = @_; + # Determine current authentication method + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; + my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain); + + # build the data structure for menu generation +my $aboutmeurl='/adm/'.$env{'user.domain'}.'/'.$env{'user.name'}.'/aboutme'; +my $role = ($env{'user.adv'} ? 'Roles' : 'Course'); +my %permissions; +if (&Apache::lonnet::usertools_access($user,$domain,'aboutme')) { + $permissions{'aboutme'} = 'F'; +} +my @menu= + ({ categorytitle=>'Personal Data', + items =>[ + { linktext => 'Personal Information Page', + url => $aboutmeurl, + permission => $permissions{'aboutme'}, + #help => 'Prefs_About_Me', + icon => 'system-users.png', + linktitle => 'Edit information about yourself that should be displayed on your public profile.' + }, + { linktext => 'Screen Name', + url => '/adm/preferences?action=changescreenname', + permission => 'F', + #help => 'Prefs_Screen_Name_Nickname', + icon => 'preferences-desktop-font.png', + linktitle => 'Change the name that is displayed in your posts.' + }, + ] + }, + { categorytitle=>'Content Display Settings', + items =>[ + { linktext => 'Language', + url => '/adm/preferences?action=changelanguages', + permission => 'F', + #help => 'Prefs_Language', + icon => 'preferences-desktop-locale.png', + linktitle => 'Choose the default language for this user.' + }, + { linktext => $role.' Page', + url => '/adm/preferences?action=changerolespref', + permission => 'F', + #help => '', + icon => 'role_hotlist.png', + linktitle => 'Configure the roles hotlist.' + }, + { linktext => 'Math display settings', + url => '/adm/preferences?action=changetexenginepref', + permission => 'F', + #help => '', + icon => 'dismath.png', + linktitle => 'Change how math is displayed.' + }, + ] + }, + { categorytitle=>'Page Display Settings', + items =>[ + { linktext => 'Color Scheme', + url => '/adm/preferences?action=changecolors', + permission => 'F', + #help => 'Change_Colors', + icon => 'preferences-desktop-theme.png', + linktitle => 'Change LON-CAPA default colors.' + }, + { linktext => 'Menu Display', + url => '/adm/preferences?action=changeicons', + permission => 'F', + #help => '', + icon => 'preferences-system-windows.png', + linktitle => 'Change whether the menus are displayed with icons or icons and text.' + } + ] + }, + { categorytitle=>'Messages & Notifications', + items =>[ + { linktext => 'Messages & Notifications', + url => '/adm/preferences?action=changemsgforward', + permission => 'F', + #help => 'Prefs_Messages', + icon => 'mail-reply-all.png', + linktitle => 'Change messageforwarding or notifications settings.' + }, + { linktext => 'Discussion Display', + url => '/adm/preferences?action=changediscussions', + permission => 'F', + #help => 'Change_Discussion_Display', + icon => 'chat.png', + linktitle => 'Set display preferences for discussion posts for both discussion boards and individual resources in all your courses.' + }, + ] + }, + { categorytitle=>'Other', + items =>[ + { linktext => 'Register Response Devices ("Clickers")', + url => '/adm/preferences?action=changeclicker', + permission => 'F', + #help => '', + icon => 'network-workgroup.png', + linktitle => 'Register your clicker.' + }, + ] + }, + ); + + if ($currentauth =~ /^(unix|internal):/) { +push(@{ $menu[0]->{items} }, { + linktext => 'Password', + url => '/adm/preferences?action=changepass', + permission => 'F', + #help => 'Change_Password', + icon => 'emblem-readonly.png', + linktitle => 'Change your password.', + }); + } + + if (&can_toggle_namelocking()) { + push(@{ $menu[0]->{items} }, { + linktext => 'Automatic name changes', + url => '/adm/preferences?action=changelockednames', + permission => 'F', + #help => '', + icon => 'system-lock-screen.png', + linktitle => 'Allow/disallow propagation of name changes from institutional directory service', + }); + } + + my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au']); + if (keys(%author_roles) > 0) { +push(@{ $menu[4]->{items} }, { + linktext => 'Restrict Domain Coordinator Access', + url => '/adm/preferences?action=changedomcoord', + permission => 'F', + #help => '', + icon => 'system-lock-screen.png', + linktitle => 'Restrict domain coordinator access.', + }); + } + + if (&Apache::lonnet::allowed('whn',$env{'request.course.id'}) + || &Apache::lonnet::allowed('whn',$env{'request.course.id'}.'/' + .$env{'request.course.sec'})) { +push(@{ $menu[4]->{items} }, { + linktext => 'Course Initialization', + url => '/adm/preferences?action=changecourseinit', + permission => 'F', + #help => '', + icon => 'course_ini.png', + linktitle => 'Set the default page to be displayed when you select a course role.', + }); + + } + if (&can_toggle_debug()) { +push(@{ $menu[4]->{items} }, { + linktext => 'Toggle Debug Messages (Currently '.($env{'user.debug'} ? 'on)' : 'off)'), + url => '/adm/preferences?action=debugtoggle', + permission => 'F', + #help => '', + icon => 'blog.png', + linktitle => 'Toggle Debug Messages.', + }); + } + + $r->print(&Apache::loncommon::start_page('My Space')); + $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Preferences')); + $r->print($message); + $r->print(Apache::lonhtmlcommon::generate_menu(@menu)); + $r->print(Apache::loncommon::end_page()); } ###################################################### @@ -980,268 +2153,167 @@ ENDVCSCREEN ################################################################ # Main handler # ################################################################ -sub handler { +sub handler { my $r = shift; - my $user = $env{'user.name'}; - my $domain = $env{'user.domain'}; - &Apache::loncommon::content_type($r,'text/html'); + Apache::loncommon::content_type($r,'text/html'); # Some pages contain DES keys and should not be cached. - &Apache::loncommon::no_cache($r); + Apache::loncommon::no_cache($r); $r->send_http_header; return OK if $r->header_only; # - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['action','wysiwyg','returnurl']); + Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, + ['action','wysiwyg','returnurl','refpage']); # - &Apache::lonhtmlcommon::clear_breadcrumbs(); - &Apache::lonhtmlcommon::add_breadcrumb + Apache::lonhtmlcommon::clear_breadcrumbs(); + Apache::lonhtmlcommon::add_breadcrumb ({href => '/adm/preferences', - text => 'Set User Preferences'}); - - my @Options; - # Determine current authentication method - my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain); - if ($currentauth =~ /^(unix|internal):/) { - push (@Options,({ action => 'changepass', - linktext => 'Change Password', - href => '/adm/preferences', - help => 'Change_Password', - subroutine => \&passwordchanger, - breadcrumb => - { href => '/adm/preferences?action=changepass', - text => 'Change Password'}, - }, - { action => 'verify_and_change_pass', - subroutine => \&verify_and_change_password, - breadcrumb => - { href =>'/adm/preferences?action=changepass', - text => 'Change Password'}, - printmenu => 'yes', - })); - } - push (@Options,({ action => 'changescreenname', - linktext => 'Change Screen Name', - href => '/adm/preferences', - help => 'Prefs_Screen_Name_Nickname', - subroutine => \&screennamechanger, - breadcrumb => - { href => '/adm/preferences?action=changescreenname', - text => 'Change Screen Name'}, - }, - { action => 'verify_and_change_screenname', - subroutine => \&verify_and_change_screenname, - breadcrumb => - { href => '/adm/preferences?action=changescreenname', - text => 'Change Screen Name'}, - printmenu => 'yes', - })); - - push (@Options,({ action => 'changemsgforward', - linktext => 'Change Message Forwarding and Notification Addresses', - href => '/adm/preferences', - help => 'Prefs_Forwarding', - breadcrumb => - { href => '/adm/preferences?action=changemsgforward', - text => 'Change Message Forwarding'}, - subroutine => \&msgforwardchanger, - }, - { action => 'verify_and_change_msgforward', - breadcrumb => - { href => '/adm/preferences?action=changemsgforward', - text => 'Change Message Forwarding'}, - printmenu => 'yes', - subroutine => \&verify_and_change_msgforward })); - my $aboutmeaction= - '/adm/'.$env{'user.domain'}.'/'.$env{'user.name'}.'/aboutme'; - push (@Options,{ action => 'none', - linktext => - q{Edit the 'About Me' Personal Information Screen}, - help => 'Prefs_About_Me', - href => $aboutmeaction}); - push (@Options,({ action => 'changecolors', - linktext => 'Change Color Scheme', - href => '/adm/preferences', - help => 'Change_Colors', - breadcrumb => - { href => '/adm/preferences?action=changecolors', - text => 'Change Colors'}, - subroutine => \&colorschanger, - }, - { action => 'verify_and_change_colors', - breadcrumb => - { href => '/adm/preferences?action=changecolors', - text => 'Change Colors'}, - printmenu => 'yes', - subroutine => \&verify_and_change_colors, - })); - push (@Options,({ action => 'changelanguages', - linktext => 'Change Language Preferences', - href => '/adm/preferences', - help => 'Prefs_Language', - breadcrumb=> - { href => '/adm/preferences?action=changelanguages', - text => 'Change Language'}, - subroutine => \&languagechanger, - }, - { action => 'verify_and_change_languages', - breadcrumb=> - {href => '/adm/preferences?action=changelanguages', - text => 'Change Language'}, - printmenu => 'yes', - subroutine=>\&verify_and_change_languages, } - )); - push (@Options,({ action => 'changewysiwyg', - linktext => 'Change WYSIWYG Editor Preferences', - href => '/adm/preferences', - breadcrumb => - { href => '/adm/preferences?action=changewysiwyg', - text => 'Change WYSIWYG Preferences'}, - subroutine => \&wysiwygchanger, - }, - { action => 'set_wysiwyg', - breadcrumb => - { href => '/adm/preferences?action=changewysiwyg', - text => 'Change WYSIWYG Preferences'}, - printmenu => 'yes', - subroutine => \&verify_and_change_wysiwyg, } - )); - push (@Options,({ action => 'changediscussions', - linktext => 'Change Discussion Display Preferences', - href => '/adm/preferences', - help => 'Change_Discussion_Display', - breadcrumb => - { href => '/adm/preferences?action=changediscussions', - text => 'Change Discussion Preferences'}, - subroutine => \&discussionchanger, - }, - { action => 'verify_and_change_discussion', - breadcrumb => - { href => '/adm/preferences?action=changediscussions', - text => 'Change Discussion Preferences'}, - printmenu => 'yes', - subroutine => \&verify_and_change_discussion, } - )); - - push (@Options,({ action => 'changerolespref', - linktext => 'Change Roles Page Preferences', - href => '/adm/preferences', - subroutine => \&rolesprefchanger, - breadcrumb => - { href => '/adm/preferences?action=changerolespref', - text => 'Change Roles Pref'}, - }, - { action => 'verify_and_change_rolespref', - subroutine => \&verify_and_change_rolespref, - breadcrumb => - { href => '/adm/preferences?action=changerolespref', - text => 'Change Roles 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{'user.name'} =~ /^(albertel|fox|foxr|koretemey|korte|hallmat3|turtle)$/) { - push (@Options,({ action => 'debugtoggle', - printmenu => 'yes', - subroutine => \&toggle_debug, - })); - } - my $html=&Apache::lonxml::xmlbegin(); - $r->print(< -LON-CAPA Preferences - -ENDHEADER - my $call = undef; - my $help = undef; - my $printmenu = 'yes'; - foreach my $option (@Options) { - if ($option->{'action'} eq $env{'form.action'}) { - $call = $option->{'subroutine'}; - $printmenu = $option->{'printmenu'}; - if (exists($option->{'breadcrumb'})) { - &Apache::lonhtmlcommon::add_breadcrumb - ($option->{'breadcrumb'}); - } - $help=$option->{'help'}; + text => 'Set User Preferences', + help => + 'Prefs_About_Me,Prefs_Language,Prefs_Screen_Name_Nickname,Change_Colors,Change_Password,Prefs_Messages,Change_Discussion_Display'}); + if(!exists $env{'form.action'}) { + &print_main_menu($r); + }elsif($env{'form.action'} eq 'changepass'){ + &passwordchanger($r); + }elsif($env{'form.action'} eq 'verify_and_change_pass'){ + &verify_and_change_password($r); + }elsif($env{'form.action'} eq 'changescreenname'){ + &screennamechanger($r); + }elsif($env{'form.action'} eq 'verify_and_change_screenname'){ + &verify_and_change_screenname($r); + }elsif($env{'form.action'} eq 'changemsgforward'){ + &msgforwardchanger($r); + }elsif($env{'form.action'} eq 'verify_and_change_msgforward'){ + &verify_and_change_msgforward($r); + }elsif($env{'form.action'} eq 'changecolors'){ + &colorschanger($r); + }elsif($env{'form.action'} eq 'verify_and_change_colors'){ + &verify_and_change_colors($r); + }elsif($env{'form.action'} eq 'changelanguages'){ + &languagechanger($r); + }elsif($env{'form.action'} eq 'verify_and_change_languages'){ + &verify_and_change_languages($r); + }elsif($env{'form.action'} eq 'changewysiwyg'){ + &wysiwygchanger($r); + }elsif($env{'form.action'} eq 'set_wysiwyg'){ + &verify_and_change_wysiwyg($r); + }elsif($env{'form.action'} eq 'changediscussions'){ + &discussionchanger($r); + }elsif($env{'form.action'} eq 'verify_and_change_discussion'){ + &verify_and_change_discussion($r); + }elsif($env{'form.action'} eq 'changerolespref'){ + &rolesprefchanger($r); + }elsif($env{'form.action'} eq 'verify_and_change_rolespref'){ + &verify_and_change_rolespref($r); + }elsif($env{'form.action'} eq 'changetexenginepref'){ + &texenginechanger($r); + }elsif($env{'form.action'} eq 'verify_and_change_texengine'){ + &verify_and_change_texengine($r); + }elsif($env{'form.action'} eq 'changeicons'){ + &iconchanger($r); + }elsif($env{'form.action'} eq 'verify_and_change_icons'){ + &verify_and_change_icons($r); + }elsif($env{'form.action'} eq 'changeclicker'){ + &clickerchanger($r); + }elsif($env{'form.action'} eq 'verify_and_change_clicker'){ + &verify_and_change_clicker($r); + }elsif($env{'form.action'} eq 'changedomcoord'){ + &domcoordchanger($r); + }elsif($env{'form.action'} eq 'verify_and_change_domcoord'){ + &verify_and_change_domcoord($r); + }elsif($env{'form.action'} eq 'lockwarning'){ + &lockwarning($r); + }elsif($env{'form.action'} eq 'verify_and_change_locks'){ + &verify_and_change_lockwarning($r); + }elsif($env{'form.action'} eq 'changecourseinit'){ + &coursedisplaychanger($r); + }elsif($env{'form.action'} eq 'verify_and_change_coursepage'){ + &verify_and_change_coursepage($r); + }elsif($env{'form.action'} eq 'debugtoggle'){ + if (&can_toggle_debug()) { + &toggle_debug(); } + &print_main_menu($r); + } elsif ($env{'form.action'} eq 'changelockednames') { + &lockednameschanger($r); + } elsif ($env{'form.action'} eq 'verify_and_change_lockednames') { + &verify_and_change_lockednames($r); } - $r->print(&Apache::loncommon::bodytag('Change Preferences')); - $r->print(&Apache::lonhtmlcommon::breadcrumbs - (undef,'Change Preferences',$help)); - if (defined($call)) { - $call->($r); - } - if (($printmenu eq 'yes') && (!$env{'form.returnurl'})) { - my $optionlist = ''; - if ($env{'user.name'} =~ - /^(albertel|kortemey|fox|foxr|korte|hallmat3|turtle)$/ - ) { - push (@Options,({ action => 'debugtoggle', - linktext => 'Toggle Debug Messages', - text => 'Current Debug status is -'. - $env{'user.debug'}.'-.', - href => '/adm/preferences', - printmenu => 'yes', - subroutine => \&toggle_debug, - })); - } - foreach my $option(@Options) { - my $optiontext = ''; - if (exists($option->{'href'})) { - $optiontext .= - ''. - &mt($option->{'linktext'}).''; - } - if (exists($option->{'text'})) { - $optiontext .= ' '.&mt($option->{'text'}); - } - if ($optiontext ne '') { - $optiontext = ''.$optiontext.''; - my $helplink = ' '; - if (exists($option->{'help'})) { - $helplink = &Apache::loncommon::help_open_topic - ($option->{'help'}); - } - $optionlist .= ''. - ''. - ''. - ''; - } - } - $optionlist .= '
    '.$helplink.''.$optiontext.'
    '; - $r->print($optionlist); - } elsif ($env{'form.returnurl'}) { - $r->print('
    '. - &mt('Return').''); + + # Properly end the HTML page of all preference pages + # started in each sub routine + # Exception: print_main_menu has its own end_page call + unless (!exists $env{'form.action'} || + $env{'form.action'} eq 'debugtoggle') { + $r->print(&Apache::loncommon::end_page()); } - $r->print(&Apache::loncommon::endbodytag().''); + return OK; } sub toggle_debug { if ($env{'user.debug'}) { - &Apache::lonnet::delenv('user\.debug'); + &Apache::lonnet::delenv('user.debug'); } else { - &Apache::lonnet::appenv('user.debug' => 1); + &Apache::lonnet::appenv({'user.debug' => 1}); + } +} + +sub can_toggle_debug { + my $can_toggle = 0; + my $page = 'toggledebug'; + if (&LONCAPA::lonauthcgi::can_view($page)) { + $can_toggle = 1; + } elsif (&LONCAPA::lonauthcgi::check_ipbased_access($page)) { + $can_toggle = 1; + } + return $can_toggle; +} + +sub can_toggle_namelocking { + my $lockablenames; + my %domconfig = + &Apache::lonnet::get_dom('configuration',['autoupdate'],$env{'user.domain'}); + if (ref($domconfig{'autoupdate'}) eq 'HASH') { + if ($domconfig{'autoupdate'}{'run'}) { + my @inststatuses = split(':',$env{'environment.inststatus'}); + unless (@inststatuses) { + @inststatuses = ('default'); + } + my %updateable = &updateable_userinfo($domconfig{'autoupdate'},\@inststatuses); + if ($updateable{'lastname'} || $updateable{'firstname'} || + $updateable{'middlename'}) { + if (ref($domconfig{'autoupdate'}{'lockablenames'}) eq 'ARRAY') { + unless (@inststatuses) { + @inststatuses = ('default'); + } + foreach my $status (@inststatuses) { + if (grep(/^\Q$status\E$/,@{$domconfig{'autoupdate'}{'lockablenames'}})) { + $lockablenames = 1; + last; + } + } + } + } + } + } + return $lockablenames; +} + +sub updateable_userinfo { + my ($autoupdate,$inststatuses) = @_; + my %updateable; + return %updateable unless ((ref($autoupdate) eq 'HASH') && + (ref($inststatuses) eq 'ARRAY')); + if (ref($autoupdate->{'fields'}) eq 'HASH') { + foreach my $status (@{$inststatuses}) { + if (ref($autoupdate->{'fields'}{$status}) eq 'ARRAY') { + foreach my $field (@{$autoupdate->{'fields'}{$status}}) { + $updateable{$field} = 1; + } + } + } } + return %updateable; } 1;