afuna: Cat under a blanket. Text: "Cats are just little people with Fur and Fangs" (Default)
afuna ([personal profile] afuna) wrote in [site community profile] changelog2009-07-11 03:29 pm

[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:
  • 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 ) {
--------------------------------------------------------------------------------