--- loncom/interface/lonpreferences.pm 2006/06/14 18:54:23 1.87
+++ loncom/interface/lonpreferences.pm 2011/07/31 01:21:04 1.194
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Preferences
#
-# $Id: lonpreferences.pm,v 1.87 2006/06/14 18:54:23 albertel Exp $
+# $Id: lonpreferences.pm,v 1.194 2011/07/31 01:21:04 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -42,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.
@@ -97,6 +99,12 @@ 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"';
@@ -107,14 +115,19 @@ sub wysiwygchanger {
}
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(<
+
-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 {
@@ -384,12 +565,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.=' ';
@@ -397,51 +578,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);
- $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 .= ' ';
+ $iconsonly_preview .= ' ';
+ }
+ }
+ $iconsonly_preview = '';
+ $iconic_preview = '';
+ $r->print(<
+
+ $lt{'iconic'} $iconic_preview
+ $lt{'iconsonly'} $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(<
+
+$helplink $text
+$clickers
+
+
+
+
+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
+ $construction
+
+
+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
+
+$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.' '.
+ ''.
+ ' '.
+ &mt('Modify').' '.
+ ''.
+ ' '.
+ &mt('Delete').' '.
+ '';
+ 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 .= ''.
+ ' '.
+ $lt{$type}.' '.(' ' x4);
+ }
+ my $htmlon = '';
+ my $htmloff = '';
+ if (grep/^\Q$item\E/,@allow_html) {
+ $htmlon = 'checked="checked" ';
+ } else {
+ $htmloff = 'checked="checked" ';
+ }
+ $output .= ' '.
+ &mt('Yes').' '.(' ' x3).
+ ' '.
+ &mt('No').' '.
+ &Apache::loncommon::end_data_table_row();
+ $num ++;
+ $counter ++;
+ }
+ my %defchk = (
+ all => 'checked="checked" ',
+ crit => '',
+ reg => '',
+ );
+ $output .= &Apache::loncommon::start_data_table_row().
+ ''.$counter.' '.
+ ''.
+ ' '.&mt('Add new address').' '.
+ '';
+ foreach my $type ('all','crit','reg') {
+ $output .= ''.
+ ' '.
+ $lt{$type}.' '.(' ' x4);
+ }
+ $output .= ' '.&mt('Yes').' '.(' ' x3).
+ ' '.
+ &mt('No').' '.
+ &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 {
@@ -450,53 +1051,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 $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 ++;
+ }
+ }
}
- my $notification=$env{'form.notification'};
+ $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);
}
################################################################
@@ -505,16 +1156,24 @@ 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=&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))) {
@@ -525,13 +1184,16 @@ sub colorschanger {
'" size="10" value="'.$curcol.
'" />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(<
+
-$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(
+ ''.$lt{'email'}.' ')
+ .' '
+ .&Apache::lonhtmlcommon::row_closure()
+ .&Apache::lonhtmlcommon::row_title(
+ ''.$lt{'username'}.' ')
+ .' '
+ .' '
+ .&Apache::lonhtmlcommon::row_closure()
+ .&Apache::lonhtmlcommon::row_title(
+ ''.$lt{'domain'}.' ')
+ .&Apache::loncommon::select_dom_form($defdom,'udom')
+ .&Apache::lonhtmlcommon::row_closure();
+ } else {
+ $output .= &Apache::lonhtmlcommon::row_title(
+ ''.$lt{'currentpass'}.' ')
+ .' '
+ .&Apache::lonhtmlcommon::row_closure();
+ }
+ $output .= &Apache::lonhtmlcommon::row_title(
+ ''.$lt{'newpass'}.' ')
+ .' '
+ .&Apache::lonhtmlcommon::row_closure()
+ .&Apache::lonhtmlcommon::row_title(
+ ''.$lt{'confirmpass'}.' ')
+ .' '
+ .&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|
+
+
+
+
-
-
-
-
-
-
-
-
+|;
+ }
+ $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):/);
+ 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'};
@@ -737,8 +1550,9 @@ sub verify_and_change_password {
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
@@ -746,10 +1560,14 @@ sub verify_and_change_password {
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
@@ -760,19 +1578,36 @@ ENDERROR
$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.');
+ ''.
+ &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.');
+ ''.
+ &mt('Passwords must be a minimum of 7 characters long.').' '.
+ &mt('Please try again.').' ',$caller,$mailtoken);
return 1;
}
#
@@ -783,32 +1618,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
- return 1;
+ 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;
}
@@ -818,6 +1667,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
@@ -831,7 +1685,7 @@ sub discussionchanger {
}
}
if (defined($userenv{'discmarkread'})) {
- unless ($userenv{'discdisplay'} eq '') {
+ unless ($userenv{'discmarkread'} eq '') {
$discmark = $userenv{'discmarkread'};
}
}
@@ -846,16 +1700,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 '
);
@@ -875,15 +1729,16 @@ sub discussionchanger {
$currmark = $lt{'ondisp'};
$newmark = 'onmark';
}
-
+
$r->print(<<"END");
-
+
$lt{'sdpf'} $lt{'prca'} $lt{'whpo'} $lt{'unwh'}
-
-
END
+
+ $r->print(''.$lt{'thde'}.'
');
+
$r->print(&Apache::loncommon::start_data_table());
$r->print(<<"END");
@@ -908,15 +1763,11 @@ END
END
$r->print(&Apache::loncommon::end_data_table_row().
&Apache::loncommon::end_data_table());
- $r->print(<<"END");
-
-
-
-
-
-Note: $lt{'thde'}
-
-END
+
+ $r->print(' '
+ .' '
+ .''
+ );
}
sub verify_and_change_discussion {
@@ -927,30 +1778,29 @@ 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']);
@@ -971,22 +1826,29 @@ sub coursedisplaychanger {
$whatsnewselect = '';
}
}
- my %pagenames = (
+ my %pagenames = &Apache::lonlocal::texthash(
firstres => 'First resource',
- whatsnew => "What's new page",
+ 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 ");
+ 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]" page in the course',"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]What's New Page[_2] in the course.",'',' ')
+ .' '
+ );
$r->print(<
+
$whatsnew_off
$whatsnew_on
ENDLSCREEN
- $r->print('
+ $r->print('
');
}
@@ -999,18 +1861,18 @@ sub verify_and_change_coursepage {
'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",
+ '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);
+ &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');
+ &Apache::lonnet::delenv('environment.course_init_display');
}
my $refpage = $env{'form.refpage'};
if (($env{'request.course.fn'}) && ($env{'request.course.id'})) {
@@ -1019,18 +1881,275 @@ sub verify_and_change_coursepage {
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
my ($furl,$ferr)=
&Apache::lonuserstate::readmap($cdom.'/'.$cnum);
- $message .= ''.$lt{'gtts'}.' '.&mt('now').' ';
+ $message .= ''.$lt{'gtts'}.' '.&mt('now').' ';
} else {
- $message .= ''.$lt{'dasp'}.' ';
+ $message .= ''.$lt{'dasp'}.' ';
}
}
- $r->print(<
-ENDVCSCREEN
+ $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
+ $locking
+
+
+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());
+}
######################################################
# other handler subroutines #
@@ -1039,296 +2158,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'},
+ 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'});
+ 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);
+ }
- 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 => 'not_on_error',
- }));
- }
- 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{'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',
- }));
+ # 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());
}
- 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|koretemey|korte|hallmat3|turtle|raeburn)$/) {
- push (@Options,({ action => 'debugtoggle',
- printmenu => 'yes',
- subroutine => \&toggle_debug,
- }));
- }
-
- $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'}) {
- $call = $option->{'subroutine'};
- $printmenu = $option->{'printmenu'};
- if (exists($option->{'breadcrumb'})) {
- &Apache::lonhtmlcommon::add_breadcrumb
- ($option->{'breadcrumb'});
- }
- $help=$option->{'help'};
- }
+ return OK;
+}
+
+sub toggle_debug {
+ if ($env{'user.debug'}) {
+ &Apache::lonnet::delenv('user.debug');
+ } else {
+ &Apache::lonnet::appenv({'user.debug' => 1});
}
- $r->print(&Apache::lonhtmlcommon::breadcrumbs('Change Preferences',$help));
- my $error;
- if (defined($call)) {
- $error = $call->($r);
- }
- if ( ( ($printmenu eq 'yes')
- || ($printmenu eq 'not_on_error' && !$error) )
- && (!$env{'form.returnurl'})) {
- my $optionlist = '';
- 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'}.'-.',
- href => '/adm/preferences',
- printmenu => 'yes',
- subroutine => \&toggle_debug,
- }));
- }
- foreach my $option(@Options) {
- my $optiontext = '';
- if (exists($option->{'href'})) {
- $option->{'href_args'}{'action'}=$option->{'action'};
- $optiontext .=
- ''.
- &mt($option->{'linktext'}).' ';
- }
- if (exists($option->{'text'})) {
- $optiontext .= ' '.&mt($option->{'text'});
+}
+
+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');
}
- if ($optiontext ne '') {
- $optiontext = ''.$optiontext.' ';
- my $helplink = ' ';
- if (exists($option->{'help'})) {
- $helplink = &Apache::loncommon::help_open_topic
- ($option->{'help'});
+ 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;
+ }
+ }
}
- $optionlist .= ''.
- ''.$helplink.' '.
- ''.$optiontext.' '.
- ' ';
}
}
- $optionlist .= '
';
- $r->print($optionlist);
- } elsif ($env{'form.returnurl'}) {
- $r->print(''.
- &mt('Return').' ');
}
- $r->print(&Apache::loncommon::end_page());
- return OK;
+ return $lockablenames;
}
-sub toggle_debug {
- if ($env{'user.debug'}) {
- &Apache::lonnet::delenv('user\.debug');
- } else {
- &Apache::lonnet::appenv('user.debug' => 1);
+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;