fu: Close-up of Fu, bringing a scoop of water to her mouth (Default)
fu ([personal profile] fu) wrote in [site community profile] changelog2012-02-10 02:43 pm

[dw-free] Refactor DW::Setting::View*Style

[commit: http://hg.dwscoalition.org/dw-free/rev/7c44db11e9d7]

http://bugs.dwscoalition.org/show_bug.cgi?id=4300

Refactor! Create new base modules DW::Setting::JournalStyle (for
::JournalEntryStyle) and DW::Setting::ViewStyle (base for ::ViewEntryStyle
and ::ViewJournalStyle) to reduce redundancy, and effort, since we have
several very similar options that don't vary in logic.

Patch by [personal profile] exor674.

Files modified:
  • cgi-bin/DW/Setting/JournalEntryStyle.pm
  • cgi-bin/DW/Setting/JournalStyle.pm
  • cgi-bin/DW/Setting/ViewEntryStyle.pm
  • cgi-bin/DW/Setting/ViewJournalStyle.pm
  • cgi-bin/DW/Setting/ViewStyle.pm
  • cgi-bin/LJ/User.pm
--------------------------------------------------------------------------------
diff -r d9889466f416 -r 7c44db11e9d7 cgi-bin/DW/Setting/JournalEntryStyle.pm
--- a/cgi-bin/DW/Setting/JournalEntryStyle.pm	Fri Feb 10 21:14:02 2012 +0800
+++ b/cgi-bin/DW/Setting/JournalEntryStyle.pm	Fri Feb 10 22:43:21 2012 +0800
@@ -6,9 +6,10 @@
 # viewing the user's own journal - the selected S2 style or the site style.
 #
 # Authors:
-#      Jen Griffin <kareila@livejournal.com>
+#       Jen Griffin <kareila@livejournal.com>
+#       Andrea Nall <anall@andreanall.com>
 #
-# Copyright (c) 2011 by Dreamwidth Studios, LLC.
+# Copyright (c) 2011-2012 by Dreamwidth Studios, LLC.
 #
 # This program is free software; you may redistribute it and/or modify it under
 # the same terms as Perl itself.  For a copy of the license, please reference
@@ -16,49 +17,31 @@
 #
 
 package DW::Setting::JournalEntryStyle;
-use base 'LJ::Setting';
+use base 'DW::Setting::JournalStyle';
 use strict;
 
 use LJ::S2;
 
-sub should_render {
-    my ( $class, $u ) = @_;
-
-    return 0 unless $u;
-    return $u->is_syndicated ? 0 : 1;
+sub label {
+    return $_[0]->ml( 'setting.display.journalentrystyle.label' );
 }
 
-sub label {
-    my ( $class, $u ) = @_;
-
-    return $class->ml( 'setting.display.journalentrystyle.label' );
+sub option_ml {
+    return $_[0]->ml('setting.display.journalentrystyle.option');
 }
 
-sub option {
-    my ( $class, $u, $errs, $args ) = @_;
-    my $key = $class->pkgkey;
-
-    my $use_s2 = $class->get_arg( $args, "journalentrystyle" ) ||
-        LJ::S2::use_journalstyle_entry_page( $u );
-
-    my $ret = LJ::html_check( {
-        name => "${key}journalentrystyle",
-        id => "${key}journalentrystyle",
-        value => 1,
-        selected => $use_s2 ? 1 : 0,
-    } );
-    $ret .= " <label for='${key}journalentrystyle'>" . $class->ml('setting.display.journalentrystyle.option') . "</label>";
-    $ret .= "<br /><i>" . $class->ml('setting.display.journalentrystyle.note') . "</i>";
-
-    return $ret;
+sub note_ml {
+    return $_[0]->ml('setting.display.journalentrystyle.note');
+}
+sub current_value {
+    return LJ::S2::use_journalstyle_entry_page( $_[1] );
 }
 
-sub save {
-    my ( $class, $u, $args ) = @_;
+sub prop_name {
+    return 'use_journalstyle_entry_page';
+}
 
-    my $val = $class->get_arg( $args, "journalentrystyle" ) ? "Y" : "N";
-    $u->set_prop( use_journalstyle_entry_page => $val );
-
+sub store_negative {
     return 1;
 }
 
diff -r d9889466f416 -r 7c44db11e9d7 cgi-bin/DW/Setting/JournalStyle.pm
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cgi-bin/DW/Setting/JournalStyle.pm	Fri Feb 10 22:43:21 2012 +0800
@@ -0,0 +1,97 @@
+#!/usr/bin/perl
+#
+# DW::Setting::JournalStyle
+#
+# LJ::Setting module for specifying which view is displayed by default when
+# viewing the user's own journal - the selected S2 style or the site style.
+#
+# Authors:
+#       Jen Griffin <kareila@livejournal.com>
+#       Andrea Nall <anall@andreanall.com>
+#
+# Copyright (c) 2011-2012 by Dreamwidth Studios, LLC.
+#
+# This program is free software; you may redistribute it and/or modify it under
+# the same terms as Perl itself.  For a copy of the license, please reference
+# 'perldoc perlartistic' or 'perldoc perlgpl'.
+#
+
+package DW::Setting::JournalStyle;
+use base 'LJ::Setting';
+use strict;
+
+# Only override the below methods
+
+sub label {
+    die "Neglected to override 'label' in DW::Setting::JournalStyle subclass";
+}
+
+sub option_ml {
+    die "Neglected to override 'option_ml' in DW::Setting::JournalStyle subclass";
+}
+
+sub note_ml {
+    return undef;
+}
+
+sub prop_name {
+    die "Neglected to override 'prop_name' in DW::Setting::JournalStyle subclass";
+}
+
+sub current_value {
+    return $_[1]->prop( $_[0]->prop_name );
+}
+
+sub store_negative {
+    return 0;
+}
+
+# Do not override any of these
+
+sub should_render {
+    my ( $class, $u ) = @_;
+
+    return 0 unless $u;
+    return $u->is_syndicated ? 0 : 1;
+}
+
+sub option {
+    my ( $class, $u, $errs, $args ) = @_;
+    my $key = $class->pkgkey;
+
+    my $use_s2 = $class->get_arg( $args, "style" ) ||
+        $class->current_value( $u );
+
+    my $ret = LJ::html_check( {
+        name => "${key}style",
+        id => "${key}style",
+        value => 1,
+        selected => $use_s2 ? 1 : 0,
+    } );
+    $ret .= " <label for='${key}style'>" . $class->option_ml . "</label>";
+
+    my $note = $class->note_ml;
+    $ret .= "<br /><i>$note</i>" if $note;
+
+    return $ret;
+}
+
+sub save {
+    my ( $class, $u, $args ) = @_;
+
+    my $name = $class->prop_name;
+    my $value = $class->get_arg( $args, "style" );
+    my $out = undef;
+
+    if ( $class->store_negative) {
+        $out = $value ? 'Y' : 'N';
+    } elsif ( $value ) {
+        $out = 'Y';
+    }
+
+    $u->set_prop( $name => $out );
+
+    return 1;
+}
+
+1;
diff -r d9889466f416 -r 7c44db11e9d7 cgi-bin/DW/Setting/ViewEntryStyle.pm
--- a/cgi-bin/DW/Setting/ViewEntryStyle.pm	Fri Feb 10 21:14:02 2012 +0800
+++ b/cgi-bin/DW/Setting/ViewEntryStyle.pm	Fri Feb 10 22:43:21 2012 +0800
@@ -7,8 +7,9 @@
 #
 # Authors:
 #      foxfirefey <foxfirefey@dreamwidth.org>
+#      Andrea Nall <anall@andreanall.com>
 #
-# Copyright (c) 2010 by Dreamwidth Studios, LLC.
+# Copyright (c) 2010-2012 by Dreamwidth Studios, LLC.
 #
 # This program is free software; you may redistribute it and/or modify it under
 # the same terms as Perl itself.  For a copy of the license, please reference
@@ -16,66 +17,24 @@
 #
 
 package DW::Setting::ViewEntryStyle;
-use base 'LJ::Setting';
+use base 'DW::Setting::ViewStyle';
 use strict;
 use warnings;
 
-sub should_render {
-    my ( $class, $u ) = @_;
-
-    return 0 unless $u;
-    return $u->is_community ? 0 : 1;
+sub supports_site {
+    return 1;
 }
 
 sub label {
-    my ( $class, $u ) = @_;
-
-    return $class->ml( 'setting.display.viewentrystyle.label' );
+    return $_[0]->ml( 'setting.display.viewentrystyle.label' );
 }
 
-sub option {
-    my ( $class, $u, $errs, $args ) = @_;
-    my $key = $class->pkgkey;
-
-    my $viewentrystyle = $class->get_arg( $args, "viewentrystyle" ) || $u->opt_viewentrystyle;
-
-    my @options = (
-        O => $class->ml( 'setting.display.viewstyle.original' ),
-        S => $class->ml( 'setting.display.viewstyle.site' ),
-        M => $class->ml( 'setting.display.viewstyle.mine' ),
-        L => $class->ml( 'setting.display.viewstyle.light' ),
-    );
-
-    my $ret = "<label for='${key}viewentrystyle'>" . $class->ml( 'setting.display.viewentrystyle.option' ) . "</label> ";
-    $ret .= LJ::html_select({
-        name => "${key}viewentrystyle",
-        id => "${key}viewentrystyle",
-        selected => $viewentrystyle,
-    }, @options );
-
-    return $ret;
+sub option_ml {
+    return $_[0]->ml( 'setting.display.viewentrystyle.option' );
 }
 
-sub error_check {
-    my ( $class, $u, $args ) = @_;
-    my $val = $class->get_arg( $args, "viewentrystyle" );
-    $class->errors( viewentrystyle => $class->ml( '.setting.display.viewstyle.invalid' ) ) unless $val =~ /^[OSML]$/;
-    return 1;
-}
-
-sub save {
-    my ( $class, $u, $args ) = @_;
-    $class->error_check( $u, $args );
-
-    my $val = $class->get_arg( $args, "viewentrystyle" );
-
-    # don't save if this is the value we are already using
-    return 1 if $u->prop( 'opt_viewentrystyle' ) and $val eq $u->prop( 'opt_viewentrystyle' );
-
-    # delete if we are turning it back to the default
-    $val = "" if $val eq "O";
-
-    $u->set_prop( "opt_viewentrystyle", $val );
+sub prop_name {
+    return 'opt_viewentrystyle';
 }
 
 1;
diff -r d9889466f416 -r 7c44db11e9d7 cgi-bin/DW/Setting/ViewJournalStyle.pm
--- a/cgi-bin/DW/Setting/ViewJournalStyle.pm	Fri Feb 10 21:14:02 2012 +0800
+++ b/cgi-bin/DW/Setting/ViewJournalStyle.pm	Fri Feb 10 22:43:21 2012 +0800
@@ -7,8 +7,9 @@
 #
 # Authors:
 #      foxfirefey <foxfirefey@dreamwidth.org>
+#      Andrea Nall <anall@andreanall.com>
 #
-# Copyright (c) 2010 by Dreamwidth Studios, LLC.
+# Copyright (c) 2010-2012 by Dreamwidth Studios, LLC.
 #
 # This program is free software; you may redistribute it and/or modify it under
 # the same terms as Perl itself.  For a copy of the license, please reference
@@ -16,67 +17,24 @@
 #
 
 package DW::Setting::ViewJournalStyle;
-use base 'LJ::Setting';
+use base 'DW::Setting::ViewStyle';
 use strict;
 use warnings;
 
-sub should_render {
-    my ( $class, $u ) = @_;
-
-    return 0 unless $u;
-    return $u->is_community ? 0 : 1;
+sub supports_site {
+    return 0;
 }
 
 sub label {
-    my ( $class, $u ) = @_;
-
-    return $class->ml( 'setting.display.viewjournalstyle.label' );
+    return $_[0]->ml( 'setting.display.viewjournalstyle.label' );
 }
 
-sub option {
-    my ( $class, $u, $errs, $args ) = @_;
-    my $key = $class->pkgkey;
-
-    my $viewjournalstyle = $class->get_arg( $args, "viewjournalstyle" ) || $u->opt_viewjournalstyle;
-
-    my @options = (
-        O => $class->ml( 'setting.display.viewstyle.original' ),
-        M => $class->ml( 'setting.display.viewstyle.mine' ),
-        # Todo: make this a viable option!  Needs some styling.
-        #S => $class->ml( 'setting.display.viewstyle.site' ),
-        L => $class->ml( 'setting.display.viewstyle.light' ),
-    );
-
-    my $ret = "<label for='${key}viewjournalstyle'>" . $class->ml( 'setting.display.viewjournalstyle.option' ) . "</label> ";
-    $ret .= LJ::html_select({
-        name => "${key}viewjournalstyle",
-        id => "${key}viewjournalstyle",
-        selected => $viewjournalstyle,
-    }, @options );
-
-    return $ret;
+sub option_ml {
+    return $_[0]->ml( 'setting.display.viewjournalstyle.option' );
 }
 
-sub error_check {
-    my ( $class, $u, $args ) = @_;
-    my $val = $class->get_arg( $args, "viewjournalstyle" );
-    $class->errors( viewjournalstyle => $class->ml( '.setting.display.viewstyle.invalid' ) ) unless $val =~ /^[OSML]$/;
-    return 1;
-}
-
-sub save {
-    my ( $class, $u, $args ) = @_;
-    $class->error_check( $u, $args );
-
-    my $val = $class->get_arg( $args, "viewjournalstyle" );
-
-    # don't save if this is the value we are already using
-    return 1 if $u->prop( 'opt_viewjournalstyle' ) and $val eq $u->prop( 'opt_viewjournalstyle' );
-
-    # delete if we are turning it back to the default
-    $val = "" if $val eq "O";
-
-    $u->set_prop( "opt_viewjournalstyle", $val );
+sub prop_name {
+    return 'opt_viewjournalstyle';
 }
 
 1;
diff -r d9889466f416 -r 7c44db11e9d7 cgi-bin/DW/Setting/ViewStyle.pm
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cgi-bin/DW/Setting/ViewStyle.pm	Fri Feb 10 22:43:21 2012 +0800
@@ -0,0 +1,108 @@
+#!/usr/bin/perl
+#
+# DW::Setting::ViewStyle
+#
+# Generic LJ::Setting module for specifying what style journal views are
+# displayed in for a user.
+#
+# Authors:
+#      foxfirefey <foxfirefey@dreamwidth.org>
+#      Andrea Nall <anall@andreanall.com>
+#
+# Copyright (c) 2010-2012 by Dreamwidth Studios, LLC.
+#
+# This program is free software; you may redistribute it and/or modify it under
+# the same terms as Perl itself.  For a copy of the license, please reference
+# 'perldoc perlartistic' or 'perldoc perlgpl'.
+#
+
+package DW::Setting::ViewStyle;
+use base 'LJ::Setting';
+use strict;
+use warnings;
+
+# Only override the below methods
+
+sub supports_site {
+    return 0;
+}
+
+sub label {
+    die "Neglected to override 'label' in DW::Setting::ViewStyle subclass";
+}
+
+sub option_ml {
+    die "Neglected to override 'option_ml' in DW::Setting::ViewStyle subclass";
+}
+
+sub prop_name {
+    die "Neglected to override 'prop_name' in DW::Setting::ViewStyle subclass";
+}
+
+# Do not override any of these
+
+sub should_render {
+    my ( $class, $u ) = @_;
+
+    return 0 unless $u;
+    return $u->is_community ? 0 : 1;
+}
+
+sub option {
+    my ( $class, $u, $errs, $args ) = @_;
+    my $key = $class->pkgkey;
+    my $name = $class->prop_name;
+
+    my $viewjournalstyle = $class->get_arg( $args, "viewjournalstyle" ) || $u->prop( $name ) || 'O';
+
+    my @options = (
+        O => $class->ml( 'setting.display.viewstyle.original' ),
+        M => $class->ml( 'setting.display.viewstyle.mine' ),
+    );
+
+    push @options, (
+        S => $class->ml( 'setting.display.viewstyle.site' ),
+    ) if $class->supports_site;
+
+    push @options, (
+        L => $class->ml( 'setting.display.viewstyle.light' ),
+    );
+
+    my $ret = "<label for='${key}style'>" . $class->option_ml . "</label> ";
+    $ret .= LJ::html_select({
+        name => "${key}style",
+        id => "${key}style",
+        selected => $viewjournalstyle,
+    }, @options );
+
+    return $ret;
+}
+
+sub error_check {
+    my ( $class, $u, $args ) = @_;
+    my $val = uc( $class->get_arg( $args, "style" ) );
+
+    $class->error( style => $class->ml( '.setting.display.viewstyle.invalid' ) ) unless $val =~ /^[OMSL]$/;
+    $class->error( style => $class->ml( '.setting.display.viewstyle.invalid' ) ) if ( $val eq 'S' && ! $class->supports_site );
+
+    return 1;
+}
+
+sub save {
+    my ( $class, $u, $args ) = @_;
+    $class->error_check( $u, $args );
+
+    my $name = $class->prop_name;
+
+    my $val = $class->get_arg( $args, "style" );
+
+    # don't save if this is the value we are already using
+    return 1 if $u->prop( $name ) and $val eq $u->prop( $name );
+
+    # delete if we are turning it back to the default
+    $val = "" if $val eq "O";
+
+    $u->set_prop( $name, $val );
+}
+
+1;
diff -r d9889466f416 -r 7c44db11e9d7 cgi-bin/LJ/User.pm
--- a/cgi-bin/LJ/User.pm	Fri Feb 10 21:14:02 2012 +0800
+++ b/cgi-bin/LJ/User.pm	Fri Feb 10 22:43:21 2012 +0800
@@ -5913,14 +5913,6 @@
     }
 }
 
-sub opt_viewentrystyle {
-    return ( $_[0]->prop( 'opt_viewentrystyle' ) || "O" );
-}
-
-sub opt_viewjournalstyle {
-    return ( $_[0]->prop( 'opt_viewjournalstyle' ) || "O" );
-}
-
 sub set_default_style {
     my $style = eval { LJ::Customize->verify_and_load_style( $_[0] ); };
     warn $@ if $@;
@@ -6001,16 +5993,13 @@
     $view ||= 'entry';
 
     my %style_types = ( O => "original", M => "mine", S => "site", L => "light" );
-
-    my $style;
-    if ( $view eq "entry" || $view eq "reply" ) {
-        $style = $style_types{ $u->opt_viewentrystyle };
-    } else {
-        $style = $style_types{ $u->opt_viewjournalstyle };
-    }
-    $style ||= 'original';
-
-    return $style;
+    my %view_props = (
+        entry => 'opt_viewentrystyle',
+        reply => 'opt_viewentrystyle',
+    );
+
+    my $prop = $view_props{ $view } || 'opt_viewjournalstyle';
+    return $style_types{ $u->prop( $prop ) } || 'original';
 }
 
 ########################################################################
--------------------------------------------------------------------------------

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org