--- loncom/interface/lonmsgdisplay.pm 2006/11/29 19:31:47 1.45 +++ loncom/interface/lonmsgdisplay.pm 2006/12/06 23:44:33 1.46 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines for messaging display # -# $Id: lonmsgdisplay.pm,v 1.45 2006/11/29 19:31:47 raeburn Exp $ +# $Id: lonmsgdisplay.pm,v 1.46 2006/12/06 23:44:33 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -138,24 +138,133 @@ my $interdis; sub folderlist { my $folder=shift; - my @allfolders=&Apache::lonnet::getkeys('email_folders'); - if ($allfolders[0]=~/^error:/) { @allfolders=(); } - return '
'. - &mt('Folder').': '. - &Apache::loncommon::select_form($folder,'folder', - ('' => &mt('INBOX'),'trash' => &mt('TRASH'), - 'new' => &mt('New Messages Only'), - 'critical' => &mt('Critical'), - 'sent' => &mt('Sent Messages'), - map { $_ => $_ } @allfolders)). - ' '.&mt('Show'). - ''. + join("\n",map { '' } - (10,20,50,100,200)).''. - '
'. + (10,20,50,100,200)).' + + '.$lt{'actn'}.'
'. + &Apache::loncommon::select_form('view','folderaction',%actions).' +
'. + ' + + + +      + + '. + '

+
'.&mt('New Folder').'
'. + ' +
+ + +'."\n". ''. - ($folder=~/^(new|critical)/?'
':''); + ''. + ($folder=~/^(new|critical)/?'':''); + return $output; +} + +sub get_permanent_folders { + my %permfolders = &Apache::lonlocal::texthash ( + '' => 'INBOX', + 'trash' => 'TRASH', + 'new' => 'New Messages Only', + 'critical' => 'Critical', + 'sent' => 'Sent Messages', + ); + return %permfolders; } sub scrollbuttons { @@ -195,14 +304,128 @@ sub statuschange { # ============================================================= Make new folder sub makefolder { - my ($newfolder)=@_; - if (($newfolder eq 'sent') - || ($newfolder eq 'critical') - || ($newfolder eq 'trash') - || ($newfolder eq 'new')) { return; } - &Apache::lonnet::put('email_folders',{$newfolder => time}); + my ($newfolder) = @_; + my %permfolders = &get_permanent_folders(); + my %userfolders = &Apache::lonmsg::get_user_folders(); + my ($outcome,$warning); + if (defined($userfolders{$newfolder})) { + return &mt('The folder name: "[_1]" is already in use for an existing folder.',$newfolder); + } + foreach my $perm (keys(%permfolders)) { + if ($permfolders{$perm} eq $newfolder) { + return &mt('The folder name: "[_1]" is already used for one of the folders automatically generated by the system.',$newfolder); + } + } + if (&get_msgfolder_lock() eq 'ok') { + my %counter_hash = &Apache::lonnet::get('email_folders',["\0".'idcount']); + my $lastcount = $counter_hash{"\0".'idcount'}; + my $folder_id = $lastcount + 1; + while (defined($userfolders{$folder_id})) { + $folder_id ++; + } + my %folderinfo = ( + id => $folder_id, + created => time, + ); + $outcome = + &Apache::lonnet::put('email_folders',{$newfolder => \%folderinfo, + "\0".'idcount' => $folder_id}); + my $releaseresult = &release_msgfolder_lock(); + if ($releaseresult ne 'ok') { + $warning = $releaseresult; + } + } else { + $outcome = 'Error - could not obtain lock on email folders record.'; + } + return ($outcome,$warning); } +# ============================================================= Delete folder + +sub deletefolder { + my ($folder)=@_; + my %permfolders = &get_permanent_folders(); + if (defined($permfolders{$folder})) { + return &mt('The folder [_1] may not be deleted',$folder); + } + my %userfolders = &Apache::lonmsg::get_user_folders(); + if (!defined($userfolders{$folder})) { + return &mt('The folder [_1] does not exist so deletion is not required.', + $folder); + } + # check folder is empty; + my $suffix=&Apache::lonmsg::foldersuffix($folder); + my @messages = &Apache::lonnet::getkeys('nohist_email'.$suffix); + if (@messages > 0) { + return &mt('The folder [_1] contains messages so it may not be deleted.'). + '
'. + &mt('Delete or move the messages to a different folder first.'); + } + my $delresult = &Apache::lonnet::del('email_folders',[$folder]); + return $delresult; +} + +sub renamefolder { + my ($folder) = @_; + my $newname = $env{'form.renamed'}; + my %permfolders = &get_permanent_folders(); + if ($env{'form.renamed'} eq '') { + return &mt('The folder "[_1]" may not be renamed to "[_2]" as the new name you requested is an invalid name.',$folder,$newname); + } + if (defined($permfolders{$newname})) { + return &mt('The folder "[_1]" may not be renamed to "[_2]" as the new name you requested is reserved for folders provided automatically by the system.',$folder,$newname); + } + my %userfolders = &Apache::lonmsg::get_user_folders(); + if (defined($userfolders{$newname})) { + return &mt('The folder "[_1]" may not be renamed to "[_2]" because the new name you requested is already being used for an existing folder.',$folder,$newname); + } + if (!defined($userfolders{$folder})) { + return &mt('The folder "[_1]" could not be renamed to "[_2]" because the folder does not exist.',$folder,$newname); + } + my %folderinfo; + if (ref($userfolders{$folder}) eq 'HASH') { + %folderinfo = %{$userfolders{$folder}}; + } else { + %folderinfo = ( + id => $folder, + created => $userfolders{$folder}, + ); + } + my $outcome = + &Apache::lonnet::put('email_folders',{$newname => \%folderinfo}); + if ($outcome eq 'ok') { + $outcome = &Apache::lonnet::del('email_folders',[$folder]); + } + return $outcome; +} + +sub get_msgfolder_lock { + # get lock for mail folder counter. + my $lockhash = { + "\0".'lock_counter' => time, + }; + my $tries = 0; + my $gotlock = &Apache::lonnet::newput('email_folders',$lockhash); + while (($gotlock ne 'ok') && $tries <3) { + $tries ++; + sleep 1; + $gotlock = &Apache::lonnet::newput('email_folders',$lockhash); + } + return $gotlock; +} + +sub release_msgfolder_lock { + # remove lock + my @del_lock = ("\0".'lock_counter'); + my $dellockoutcome=&Apache::lonnet::del('email_folders',\@del_lock); + if ($dellockoutcome ne 'ok') { + return ('
'.&mt('Warning: failed to release lock for counter').'
'); + } else { + return 'ok'; + } +} + + # ======================================================== Move between folders sub movemsg { @@ -520,6 +743,7 @@ sub sortedmessages { my ($blocked,$startblock,$endblock,$numblocked,$folder) = @_; my $suffix=&Apache::lonmsg::foldersuffix($folder); my @messages = &Apache::lonnet::getkeys('nohist_email'.$suffix); + #unpack the varibles and repack into temp for sorting my @temp; my %descriptions; @@ -640,7 +864,7 @@ sub disnew { my %lt=&Apache::lonlocal::texthash( 'nm' => 'New Messages', 'su' => 'Subject', - 'co' => 'Course/Group', + 'co' => 'Course', 'da' => 'Date', 'us' => 'Username', 'op' => 'Open', @@ -799,9 +1023,9 @@ ENDDISHEADER } $r->print(''); if ($env{'form.sortedby'} eq "revcourse") { - $r->print(''.&mt('Course/Group').''); + $r->print(''.&mt('Course').''); } else { - $r->print(''.&mt('Course/Group').''); + $r->print(''.&mt('Course').''); } $r->print(''); if ($env{'form.sortedby'} eq "revstatus") { @@ -864,12 +1088,14 @@ ENDDISHEADER '

'); } $r->print('

'); - my @allfolders=&Apache::lonnet::getkeys('email_folders'); - if ($allfolders[0]=~/^error:/) { @allfolders=(); } + my %gotfolders = &Apache::lonmsg::get_user_folders(); + my %userfolders; + foreach my $key (keys(%gotfolders)) { + $userfolders{$key} = $key; + } $r->print( &Apache::loncommon::select_form('','movetofolder', - ( map { $_ => $_ } @allfolders)) - ); + %userfolders)); my $postedstartdis=$startdis+1; $r->print(''); if ($numblocked > 0) { @@ -2207,11 +2433,43 @@ sub handler { } } elsif ($env{'form.newfolder'}) { &printheader($r,'','New Folder'); - &makefolder($env{'form.newfolder'}); - &Apache::loncommunicate::menu($r); - &disall($r,$env{'form.newfolder'}); + my $showfolder = $env{'form.newfolder'}; + my ($makeresult,$warning) = &makefolder($env{'form.newfolder'}); + if ($makeresult eq 'ok') { + $r->print(&mt('Mail folder "[_1]" created.',$showfolder).'
'); + } else { + $r->print(&mt('Creation failed.').' '.$makeresult.'
'. + $warning); + $showfolder = $folder; + } + &Apache::loncommunicate::menu($r); + &disall($r,$showfolder); } elsif ($env{'form.showcommentbaseurl'}) { &storedcommentlisting($r); + } elsif ($env{'form.folderaction'} eq 'delete') { + &printheader($r,'','Deleted Folder'); + my $showfolder = ''; + my $delresult = &deletefolder($folder); + if ($delresult eq 'ok') { + $r->print(&mt('Mail folder "[_1]" deleted.',$folder).'
'); + } else { + $r->print(&mt('Deletion failed.').' '.$delresult.'
'); + $showfolder = $folder; + } + &Apache::loncommunicate::menu($r); + &disall($r,$showfolder); + } elsif ($env{'form.folderaction'} eq 'rename') { + &printheader($r,'','Renamed Folder'); + my $showfolder = $env{'form.renamed'}; + my $renresult = &renamefolder($folder); + if ($renresult eq 'ok') { + $r->print(&mt('Mail folder "[_1]" renamed "[_2]".',$folder,$showfolder).'
'); + } else { + $r->print(&mt('Renaming failed.').' '.$renresult.'
'); + $showfolder = $folder; + } + &Apache::loncommunicate::menu($r); + &disall($r,$showfolder); } else { &printheader($r,'','Display All Messages'); &Apache::loncommunicate::menu($r);