--- loncom/interface/lonpreferences.pm 2005/07/05 15:25:34 1.66
+++ loncom/interface/lonpreferences.pm 2007/05/08 17:23:10 1.102
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Preferences
#
-# $Id: lonpreferences.pm,v 1.66 2005/07/05 15:25:34 albertel Exp $
+# $Id: lonpreferences.pm,v 1.102 2007/05/08 17:23:10 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,7 @@ use Apache::loncommon();
use Apache::lonhtmlcommon();
use Apache::lonlocal;
use Apache::lonnet;
+use LONCAPA();
#
# Write lonnet::passwd to do the call below.
@@ -98,16 +100,16 @@ sub wysiwygchanger {
my $r = shift;
my %userenv = &Apache::lonnet::get
('environment',['wysiwygeditor']);
+ my $onselect='checked="checked"';
my $offselect='';
- my $onselect='checked="1"';
- if ($userenv{'wysiwygeditor'}) {
+ if ($userenv{'wysiwygeditor'} eq 'on') {
$onselect='';
- $offselect='checked="1"';
+ $offselect='checked="checked"';
}
my $switchoff=&mt('Disable WYSIWYG editor');
my $switchon=&mt('Enable WYSIWYG editor');
$r->print(<
+
+
Convert to Images
+
+
+
ENDLSCREEN
if ($env{'environment.texengine'} ne 'jsMath') {
$r->print('');
@@ -277,6 +280,8 @@ ENDVCSCREEN
################################################################
sub rolesprefchanger {
my $r = shift;
+ my $role = ($env{'user.adv'} ? 'Role' : 'Course');
+ my $lc_role = ($env{'user.adv'} ? 'role' : 'course');
my $user = $env{'user.name'};
my $domain = $env{'user.domain'};
my %userenv = &Apache::lonnet::get
@@ -296,51 +301,153 @@ 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('Some LON-CAPA users have a long list of '.$lc_role.'s. The Recent '.$role.'s Hotlist feature keeps track of the last N '.$lc_role.'s which have been visited and places a table of these at the top of the '.$lc_role.'s page. People with very few '.$lc_role.'s should leave this feature disabled.').'
+
+
- Enable Recent Roles Hotlist:
-
- Number of roles in Hotlist:
+
+ '.&mt('Number of '.$role.'s in Hotlist:').'
+
'.&mt('This list below can be used to freeze '.$lc_role.'s on your screen. Those marked as frozen will not be removed from the list, even if they have not been used recently.').'
+
+'.$roles_check_list.'
-
-
-ENDSCREEN
+
+');
+}
+
+sub rolespref_get_role_text {
+# Get a line of text for each role
+ my ($roles) = @_;
+ my %roletext = ();
+
+ foreach my $item (@$roles) {
+# get course information
+ my ($role,$rest) = split(/\./, $item);
+ my $trole = "";
+ $trole = &Apache::lonnet::plaintext($role);
+ my ($tdomain,$other,$tsection)= split(/\//,Apache::lonnet::declutter($rest));
+ my $tother = '-';
+ if ($role =~ /^(cc|st|in|ta|ep|cr)/ ) {
+ my %newhash=&Apache::lonnet::coursedescription($tdomain."_".$other);
+ $tother = " - ".$newhash{'description'};
+ } elsif ($role =~ /dc/) {
+ $tother = "";
+ } else {
+ $tother = " - $other";
+ }
+
+ my $section="";
+ if ($tsection) {
+ $section = " - Section/Group: $tsection";
+ }
+ $roletext{$item} = $tdomain." - ".$trole.$tother.$section;
+ }
+ return %roletext;
}
sub verify_and_change_rolespref {
my $r = shift;
+ my $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';
+ $message=&mt('Recent '.$role.'s Hotlist is Enabled');
} else {
&Apache::lonnet::del('environment',['recentroles']);
&Apache::lonnet::delenv('environment\.recentroles');
- $message='Recent Roles Hotlist is Disabled';
+ $message=&mt('Recent '.$role.'s Hotlist is Disabled');
}
if ($hotlist_n) {
&Apache::lonnet::put('environment',{'recentrolesn' => $hotlist_n});
&Apache::lonnet::appenv('environment.recentrolesn' => $hotlist_n);
if ($hotlist_flag) {
- $message.=" Display $hotlist_n Most Recent Roles\n";
+ $message.=" ".
+ &mt('Display [_1] Most Recent '.$role.'s',$hotlist_n)."\n";
+ }
+ }
+
+# Get list of froze roles and list of recent roles
+ my @freeze_list = &Apache::loncommon::get_env_multiple('form.freezeroles');
+ my %freeze = ();
+ my %roletext = ();
+
+ foreach my $key (@freeze_list) {
+ $freeze{$key}='1';
+ }
+
+ my %recent_roles =
+ &Apache::lonhtmlcommon::get_recent('roles',$env{'environment.recentrolesn'});
+ my %frozen_roles =
+ &Apache::lonhtmlcommon::get_recent_frozen('roles',$env{'environment.recentrolesn'});
+ my %role_text = &rolespref_get_role_text([keys(%recent_roles)]);
+
+# Unset any roles that were previously frozen but aren't in list
+ foreach my $role_key (sort(keys(%recent_roles))) {
+ if (($frozen_roles{$role_key}) && (!exists($freeze{$role_key}))) {
+ $message .= " ".&mt('Unfreezing '.$role.': [_1]',$role_text{$role_key})."\n";
+ &Apache::lonhtmlcommon::store_recent('roles',$role_key,' ',0);
+ }
+ }
+
+# Freeze selected roles
+ foreach my $role_key (@freeze_list) {
+ if (!$frozen_roles{$role_key}) {
+ $message .= " ".&mt('Freezing '.$role.': [_1]',$role_text{$role_key})."\n";
+ &Apache::lonhtmlcommon::store_recent('roles',
+ $role_key,' ',1);
}
}
+ $message .= " \n";
$r->print(<print(<
+
New screenname (shown if you post anonymously):
@@ -402,44 +509,219 @@ sub verify_and_change_screenname {
&Apache::lonnet::delenv('environment\.nickname');
$message.='Reset nickname';
}
-
+ &Apache::lonnet::devalidate_cache_new('namescache',$user.':'.$domain);
$r->print(<print(<
+
+
+
+
+
+
+ENDSCREEN
+}
+
+sub verify_and_change_icons {
+ my $r = shift;
+ my $user = $env{'user.name'};
+ my $domain = $env{'user.domain'};
+ my $newicons = $env{'form.menumode'};
+
+ &Apache::lonnet::put('environment',{'icons' => $newicons});
+ &Apache::lonnet::appenv('environment.icons' => $newicons);
+ $r->print(&mt('Set menu mode to [_1].',$newicons));
+}
+
+################################################################
# 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 %lt = &Apache::lonlocal::texthash(
+ all => 'All',
+ crit => 'Critical only',
+ reg => 'Non-critical only',
+ foad => 'Forwarding Address(es)',
+ mnot => 'Message Notification Email Address(es)',
+ chg => 'Change',
+ email => 'The e-mail address you entered',
+ notv => 'is not a valid e-mail address',
+ toen => "To enter multiple addresses, enter one address at a time, click 'Change' and then add the next one',
+ prme => 'Back to preferences menu',
+ );
my $forwardingHelp = Apache::loncommon::help_open_topic("Prefs_Forwarding",
"What are forwarding ".
"and notification ".
"addresses");
my $criticalMessageHelp = Apache::loncommon::help_open_topic("Course_Critical_Message",
"What are critical messages");
-
+ my @allow_html = split(/,/,$userenv{'notifywithhtml'});
+ my %allnot = &get_notifications(\%userenv);
+ my $validatescript = &Apache::lonhtmlcommon::javascript_valid_email();
+ my $jscript = qq|
+
+|;
$r->print(<
-
\n".
+ &mt("One or more password fields were blank").
+ "\n
",$caller,$mailtoken);
return;
}
# Get the keys
@@ -765,34 +1201,48 @@ 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 ($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 +1252,30 @@ ENDERROR
}
if ($badpassword) {
# I can't figure out how to enter bad characters on my browser.
- &passwordchanger($r,<ERROR:
-The password you entered contained illegal characters.
-Valid characters are: space and
+ my $errormessage =''.
+ &mt('The password you entered contained illegal characters').'. '.
+ &mt('Valid characters are').(<<"ENDERROR");
+: space and
+
ENDERROR
+ &passwordchanger($r,$errormessage,$caller,$mailtoken);
+ return 1;
}
#
# Change the password (finally)
my $result = &Apache::lonnet::changepass
- ($user,$domain,$currentpass,$newpass1,$homeserver);
+ ($user,$domain,$currentpass,$newpass1,$homeserver,$caller);
# Inform the user the password has (not?) been changed
if ($result =~ /^ok$/) {
- $r->print(<<"ENDTEXT");
-
The password for $user was successfully changed
-ENDTEXT
+ $r->print("
".&mt('The password for [_1] was successfully changed',$user)."
");
} else {
# error error: run in circles, scream and shout
- $r->print(<The password for $user was not changed
-Please make sure your old password was entered correctly.
-ENDERROR
+ $r->print("
".&mt("The password for [_1] was not changed",$user)."
".
+ &mt('Please make sure your old password was entered correctly').'.');
+ return 1;
}
return;
}
@@ -895,43 +1344,41 @@ sub discussionchanger {
}
$r->print(<<"END");
-
Note: $lt{'thde'}
@@ -947,11 +1394,11 @@ 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 .='In discussions: only new posts will be displayed. ';
&Apache::lonnet::put('environment',{'discdisplay' => $newdisp});
&Apache::lonnet::appenv('environment.discdisplay' => $newdisp);
} else {
- $message .= 'In discussions: all posts will be displayed. ';
+ $message .= 'In discussions: all posts will be displayed. ';
&Apache::lonnet::del('environment',['discdisplay']);
&Apache::lonnet::delenv('environment\.discdisplay');
}
@@ -959,11 +1406,11 @@ sub verify_and_change_discussion {
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.='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);
} else {
- $message.='In discussions: posts will be identified as "new" until marked as read by the reader. ';
+ $message.='In discussions: posts will be identified as "new" until marked as read by the reader. ';
&Apache::lonnet::del('environment',['discmarkread']);
&Apache::lonnet::delenv('environment\.discmarkread');
}
@@ -981,24 +1428,32 @@ sub coursedisplaychanger {
my $user = $env{'user.name'};
my $domain = $env{'user.domain'};
my %userenv = &Apache::lonnet::get('environment',['course_init_display']);
-
- my $firstselect='checked="checked"';
- my $whatsnewselect='';
- if ($userenv{'course_init_display'} ne 'firstres') {
- $firstselect='';
- $whatsnewselect='checked="checked"';
+ 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 $whatsnew_off=&mt('Display the first resource in the course.');
- my $whatsnew_on=&mt('Display a summary of items in the course which require action from the course coordinator.');
+ my %pagenames = (
+ firstres => 'First resource',
+ whatsnew => "What's new page",
+ );
+ my $whatsnew_off=&mt('Display the [_1] in the course.','first resource');
+ my $whatsnew_on=&mt('Display the "[_1]" page - a summary of items in the course which require attention.',"What's New");
- $r->print(' '.&mt('Set the page to be displayed when you select the role of Course Coordinator').':');
+ $r->print(' '.&mt('Set the default page to be displayed when you select a course role').' '.&mt('(Currently: [_1])',$pagenames{$currvalue}).' '.&mt('The global user preference you set for your courses can be overridden in an individual course by setting a course specific setting via the "[_1]" page in the course',"What's New").'
');
$r->print(<
+
+
-
+
ENDLSCREEN
- $r->print('
+ $r->print('
');
}
@@ -1006,22 +1461,25 @@ sub verify_and_change_coursepage {
my $r = shift;
my $message='';
my %lt = &Apache::lonlocal::texthash(
- 'when' => 'Whenever you select the Course Coordinator role from the roles screen',
+ '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 a summary page listing course action items',
+ 'dasp' => "Display the What's New page listing course action items",
);
my $newdisp = $env{'form.newdisp'};
+ $message = ''.$lt{'defs'}.': '.$lt{'when'}.', ';
if ($newdisp eq 'firstres') {
- $message .= $lt{'when'}.', '.$lt{'ywbt'}.' ';
+ $message .= $lt{'ywbt'}.' ';
&Apache::lonnet::put('environment',{'course_init_display' => $newdisp});
&Apache::lonnet::appenv('environment.course_init_display' => $newdisp);
} else {
- $message .= $lt{'when'}.', '.$lt{'apwb'}.' ';
+ $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'};
@@ -1030,7 +1488,8 @@ sub verify_and_change_coursepage {
&Apache::lonuserstate::readmap($cdom.'/'.$cnum);
$message .= ' '.$lt{'gtts'}.' '.&mt('now').'';
} else {
- $message .= ' '.$lt{'dasp'}.'';
+ $message .= ' '.$lt{'dasp'}.'';
}
}
$r->print(<header_only;
#
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
- ['action','wysiwyg','returnurl']);
+ ['action','wysiwyg','returnurl','refpage']);
#
&Apache::lonhtmlcommon::clear_breadcrumbs();
&Apache::lonhtmlcommon::add_breadcrumb
@@ -1083,7 +1542,7 @@ sub handler {
breadcrumb =>
{ href =>'/adm/preferences?action=changepass',
text => 'Change Password'},
- printmenu => 'yes',
+ printmenu => 'not_on_error',
}));
}
push (@Options,({ action => 'changescreenname',
@@ -1104,7 +1563,7 @@ sub handler {
}));
push (@Options,({ action => 'changemsgforward',
- linktext => 'Change Message Forwarding and Notification Addresses',
+ linktext => 'Change Message Forwarding and Notification Email Addresses',
href => '/adm/preferences',
help => 'Prefs_Forwarding',
breadcrumb =>
@@ -1116,7 +1575,7 @@ sub handler {
breadcrumb =>
{ href => '/adm/preferences?action=changemsgforward',
text => 'Change Message Forwarding'},
- printmenu => 'yes',
+ printmenu => 'no',
subroutine => \&verify_and_change_msgforward }));
my $aboutmeaction=
'/adm/'.$env{'user.domain'}.'/'.$env{'user.name'}.'/aboutme';
@@ -1188,20 +1647,21 @@ sub handler {
printmenu => 'yes',
subroutine => \&verify_and_change_discussion, }
));
-
+
+ my $role = ($env{'user.adv'} ? 'Roles' : 'Course');
push (@Options,({ action => 'changerolespref',
- linktext => 'Change Roles Page Preferences',
+ linktext => 'Change '.$role.' Page Preferences',
href => '/adm/preferences',
subroutine => \&rolesprefchanger,
breadcrumb =>
{ href => '/adm/preferences?action=changerolespref',
- text => 'Change Roles Pref'},
+ text => 'Change '.$role.' Page Pref'},
},
{ action => 'verify_and_change_rolespref',
subroutine => \&verify_and_change_rolespref,
breadcrumb =>
{ href => '/adm/preferences?action=changerolespref',
- text => 'Change Roles Preferences'},
+ text => 'Change '.$role.' Page Preferences'},
printmenu => 'yes',
}));
@@ -1220,7 +1680,38 @@ sub handler {
text => 'Change Math Preferences'},
printmenu => 'yes',
}));
- if($env{'request.role'} =~ /^cc\.\//) {
+
+ if ($env{'environment.remote'} eq 'off') {
+ push (@Options,({ action => 'launch',
+ linktext => 'Launch Remote Control',
+ href => '/adm/remote?url=/adm/preferences',
+ }));
+ } else {
+ push (@Options,({ action => 'collapse',
+ linktext => 'Collapse Remote Control',
+ href => '/adm/remote?url=/adm/preferences',
+ }));
+ }
+
+ push (@Options,({ action => 'changeicons',
+ linktext => 'Change How Menus are Displayed',
+ href => '/adm/preferences',
+ subroutine => \&iconchanger,
+ breadcrumb =>
+ { href => '/adm/preferences?action=changeicons',
+ text => 'Change Main Menu'},
+ },
+ { action => 'verify_and_change_icons',
+ subroutine => \&verify_and_change_icons,
+ breadcrumb =>
+ { href => '/adm/preferences?action=changeicons',
+ text => 'Change Main Menu'},
+ printmenu => 'yes',
+ }));
+
+ 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',
@@ -1243,13 +1734,9 @@ sub handler {
subroutine => \&toggle_debug,
}));
}
- my $html=&Apache::lonxml::xmlbegin();
- $r->print(<
-LON-CAPA Preferences
-
-ENDHEADER
+
+ $r->print(&Apache::loncommon::start_page('Change Preferences'));
+
my $call = undef;
my $help = undef;
my $printmenu = 'yes';
@@ -1264,13 +1751,14 @@ ENDHEADER
$help=$option->{'help'};
}
}
- $r->print(&Apache::loncommon::bodytag('Change Preferences'));
- $r->print(&Apache::lonhtmlcommon::breadcrumbs
- (undef,'Change Preferences',$help));
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Change Preferences',$help));
+ my $error;
if (defined($call)) {
- $call->($r);
+ $error = $call->($r);
}
- if (($printmenu eq 'yes') && (!$env{'form.returnurl'})) {
+ if ( ( ($printmenu eq 'yes')
+ || ($printmenu eq 'not_on_error' && !$error) )
+ && (!$env{'form.returnurl'})) {
my $optionlist = '