[dw-free] Restore previous statusvis after undeletion instead of forcing it to V
[commit: http://hg.dwscoalition.org/dw-free/rev/fb6cfdde33c8]
http://bugs.dwscoalition.org/show_bug.cgi?id=482
Restore previous status after deleting/undeleting. Avoids issues where
readonly-status could be removed by deleting/undeleting.
Patch by gariev @ LiveJournal; prepared for Dreamwidth by denise.
Files modified:
http://bugs.dwscoalition.org/show_bug.cgi?id=482
Restore previous status after deleting/undeleting. Avoids issues where
readonly-status could be removed by deleting/undeleting.
Patch by gariev @ LiveJournal; prepared for Dreamwidth by denise.
Files modified:
- cgi-bin/LJ/User.pm
- htdocs/accountstatus.bml
-------------------------------------------------------------------------------- diff -r f350288cf1bb -r fb6cfdde33c8 cgi-bin/LJ/User.pm --- a/cgi-bin/LJ/User.pm Sat Jul 11 15:20:42 2009 +0000 +++ b/cgi-bin/LJ/User.pm Sat Jul 11 15:28:56 2009 +0000 @@ -376,6 +376,20 @@ sub who_invited { ######################################################################## ### 2. Statusvis and Account Types +sub get_previous_statusvis { + my $u = shift; + + my $extra = $u->selectcol_arrayref( + "SELECT extra FROM userlog WHERE userid=? AND action='accountstatus' ORDER BY logtime DESC", + undef, $u->{userid}); + my @statusvis; + foreach my $e (@$extra) { + my %fields; + LJ::decode_url_string($e, \%fields, []); + push @statusvis, $fields{old}; + } + return @statusvis; +} sub is_deleted { my $u = shift; diff -r f350288cf1bb -r fb6cfdde33c8 htdocs/accountstatus.bml --- a/htdocs/accountstatus.bml Sat Jul 11 15:20:42 2009 +0000 +++ b/htdocs/accountstatus.bml Sat Jul 11 15:28:56 2009 +0000 @@ -27,6 +27,7 @@ body<= if (LJ::did_post() && LJ::check_referer('/accountstatus.bml')) { my $ret; + my $statusvis = $POST{'statusvis'}; my $ok = sub { return "<?h1 $ML{'.header.success'} h1?>\n<?p " . $_[0] . " p?>"; }; @@ -48,11 +49,11 @@ body<= # invalid statusvis return LJ::bad_input($ML{'.error.invalid'}) - unless $POST{'statusvis'} eq 'D' || $POST{'statusvis'} eq 'V'; + unless $statusvis eq 'D' || $statusvis eq 'V'; # no need to change? - return $ok->(BML::ml('.message.nochange', {'statusvis' => $statusvis{$POST{'statusvis'}} })) - if $u->statusvis eq $POST{'statusvis'}; + return $ok->(BML::ml('.message.nochange', {'statusvis' => $statusvis{$statusvis} })) + if $u->statusvis eq $statusvis; my $res = 0; @@ -61,7 +62,7 @@ body<= my @date = localtime(time); my $date = sprintf("%02d:%02d %02d/%02d/%04d", @date[2,1], $date[3], $date[4]+1, $date[5]+1900); - if ($POST{'statusvis'} eq 'D') { + if ($statusvis eq 'D') { $res = $u->set_deleted; @@ -75,9 +76,21 @@ body<= datetime => $date, })->fire; } - } elsif ($POST{'statusvis'} eq 'V') { - - $res = $u->set_visible; + } elsif ($statusvis eq 'V') { + ## Restore previous statusvis of journal. It may be different + ## from 'V', it may be read-only, or locked, or whatever. + my @previous_status = grep { $_ ne 'D' } $u->get_previous_statusvis; + my $new_status = $previous_status[0] || 'V'; + my $method = { + V => 'set_visible', + L => 'set_locked', + M => 'set_memorial', + O => 'set_readonly', + R => 'set_renamed', + }->{$new_status}; + return $dberr->("Can't set status '$new_status'") unless $method; + + $res = $u->$method; $u->set_prop( delete_reason => "" ); @@ -95,9 +108,9 @@ body<= unless $res; # success - $ret .= $ok->(BML::ml('.message.success', {'statusvis' => $statusvis{$POST{'statusvis'}} })); + $ret .= $ok->(BML::ml('.message.success', {'statusvis' => $statusvis{$statusvis} })); - if ($POST{statusvis} eq 'D') { + if ($statusvis eq 'D') { $ret .= "<?p $ML{'.message.deleted'} p?>"; if ( $u->is_person ) { --------------------------------------------------------------------------------