[dw-free] Need function to set current site scheme in DW::SiteScheme
[commit: http://hg.dwscoalition.org/dw-free/rev/af46f441997b]
http://bugs.dwscoalition.org/show_bug.cgi?id=3526
Add functions to set site skin for the user, or just for the current
request. Update in various locations to use this.
Patch by
exor674.
Files modified:
http://bugs.dwscoalition.org/show_bug.cgi?id=3526
Add functions to set site skin for the user, or just for the current
request. Update in various locations to use this.
Patch by
![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Files modified:
- cgi-bin/DW/Controller/Dev.pm
- cgi-bin/DW/SiteScheme.pm
- cgi-bin/LJ/Setting/SiteScheme.pm
- cgi-bin/LJ/User.pm
-------------------------------------------------------------------------------- diff -r 87b564b441db -r af46f441997b cgi-bin/DW/Controller/Dev.pm --- a/cgi-bin/DW/Controller/Dev.pm Thu Mar 10 11:27:54 2011 +0800 +++ b/cgi-bin/DW/Controller/Dev.pm Thu Mar 10 12:05:10 2011 +0800 @@ -19,6 +19,7 @@ use strict; use strict; use warnings; use DW::Routing; +use DW::SiteScheme; use JSON; @@ -26,7 +27,9 @@ DW::Routing->register_static( '/dev/clas if ( $LJ::IS_DEV_SERVER ) { DW::Routing->register_string( '/dev/tests/index', \&tests_index_handler, app => 1 ); - DW::Routing->register_regex( '/dev/tests/([^/]+)(?:/(.*))?', \&tests_handler, app => 1 ) + DW::Routing->register_regex( '/dev/tests/([^/]+)(?:/(.*))?', \&tests_handler, app => 1 ); + + DW::Routing->register_string( '/dev/testhelper/jsondump', \&testhelper_json_handler, app => 1, format => "json" ); } sub tests_index_handler { @@ -34,7 +37,7 @@ sub tests_index_handler { my $r = DW::Request->get; - $r->note( bml_use_scheme => "global" ); + DW::SiteScheme->set_for_request( 'global' ); return DW::Template->render_template( "dev/tests-all.tt", { all_tests => [ map { $_ =~ m!tests/([^/]+)\.js!; } glob("$LJ::HOME/views/dev/tests/*.js") ] } ); @@ -50,7 +53,7 @@ sub tests_handler { if ( ! defined $lib ) { return $r->redirect("$LJ::SITEROOT/dev/tests/$test/"); } elsif ( ! $lib ) { - $r->note( bml_use_scheme => "global" ); + DW::SiteScheme->set_for_request( 'global' ); return DW::Template->render_template( "dev/tests-all.tt", { test => $test, } ); @@ -81,7 +84,7 @@ sub tests_handler { # force a site scheme which only shows the bare content # but still prints out resources included using need_res - $r->note( bml_use_scheme => "global" ); + DW::SiteScheme->set_for_request( 'global' ); # we don't validate the test name, so be careful! return DW::Template->render_template( "dev/tests.tt", { @@ -91,12 +94,6 @@ sub tests_handler { tests => $testcontent, includes => \@includes, } ); -} - - -# test helpers -if ( $LJ::IS_DEV_SERVER ) { - DW::Routing->register_string( '/dev/testhelper/jsondump', \&testhelper_json_handler, app => 1, format => "json" ) } sub testhelper_json_handler { diff -r 87b564b441db -r af46f441997b cgi-bin/DW/SiteScheme.pm --- a/cgi-bin/DW/SiteScheme.pm Thu Mar 10 11:27:54 2011 +0800 +++ b/cgi-bin/DW/SiteScheme.pm Thu Mar 10 12:05:10 2011 +0800 @@ -25,7 +25,7 @@ package DW::SiteScheme; package DW::SiteScheme; use strict; -our %sitescheme_data = ( +my %sitescheme_data = ( blueshift => { parent => 'common', title => "Blueshift" }, celerity => { parent => 'common', title => "Celerity" }, common => { parent => 'global', internal => 1 }, @@ -38,8 +38,15 @@ our %sitescheme_data = ( my $data_loaded = 0; -our @sitescheme_order = (); +my @sitescheme_order = (); +=head2 C<< DW::SiteScheme->get( $scheme ) >> + +$scheme defaults to the current sitescheme. + +Returns a DW::SiteScheme object. + +=cut sub get { my ( $class, $scheme ) = @_; $class->__load_data; @@ -178,4 +185,65 @@ sub current { 'global'; } +=head2 C<< DW::SiteScheme->set_for_request( $scheme ) >> + +Set the sitescheme for the request. + +Note: this must be called early enough in a request +before calling into bml_handler for BML, or before render_template for TT +otherwise has no action. + +=cut +sub set_for_request { + my $r = DW::Request->get; + + return 0 unless exists $sitescheme_data{$_[1]}; + $r->note( 'bml_use_scheme', $_[1] ); + + return 1; +} + +=head2 C<< DW::SiteScheme->set_for_user( $scheme, $u ) >> + +Set the sitescheme for the user. + +If $u does not exist, this will default to remote +if $u ( or remote ) is undef, this will only set the cookie. + +Note: If done early enough in the process this will affect the current request. +See the note on set_for_request + +=cut +sub set_for_user { + my $r = DW::Request->get; + + my $scheme = $_[1]; + my $u = exists $_[2] ? $_[2] : LJ::get_remote(); + + return 0 unless exists $sitescheme_data{$scheme}; + my $cval = $scheme; + if ( $scheme eq $sitescheme_order[0] && !$LJ::SAVE_SCHEME_EXPLICITLY ) { + $cval = undef; + $r->delete_cookie( domain => ".$LJ::DOMAIN", name => 'BMLschemepref' ); + } + + my $expires = undef; + if ($u) { + # set a userprop to remember their schemepref + $u->set_prop( schemepref => $scheme ); + + # cookie expires when session expires + $expires = $u->{_session}->{timeexpire} if $u->{_session}->{exptype} eq "long"; + } + + $r->add_cookie( + name => 'BMLschemepref', + value => $cval, + expires => $expires, + domain => ".$LJ::DOMAIN", + ) if $cval; + + return 1; +} + 1; diff -r 87b564b441db -r af46f441997b cgi-bin/LJ/Setting/SiteScheme.pm --- a/cgi-bin/LJ/Setting/SiteScheme.pm Thu Mar 10 11:27:54 2011 +0800 +++ b/cgi-bin/LJ/Setting/SiteScheme.pm Thu Mar 10 12:05:10 2011 +0800 @@ -99,33 +99,13 @@ sub save { my $r = DW::Request->get; - my $val = my $cval = $class->get_arg($args, "sitescheme"); + my $val = $class->get_arg($args, "sitescheme"); return 1 unless $val; - my @bml_schemes = DW::SiteScheme->available; - # don't set cookie for default scheme - if ($val eq $bml_schemes[0]->{scheme} && !$LJ::SAVE_SCHEME_EXPLICITLY) { - $cval = ""; - $r->delete_cookie( domain => ".$LJ::DOMAIN", name => 'BMLschemepref' ); + unless ( DW::SiteScheme->set_for_user( $val, $u ) ) { + return 0; } - - my $expires = undef; - if ($u) { - # set a userprop to remember their schemepref - $u->set_prop( schemepref => $val ); - - # cookie expires when session expires - $expires = $u->{_session}->{timeexpire} - if $u->{_session}->{exptype} eq "long"; - } - - $r->add_cookie( - name => 'BMLschemepref', - value => $cval, - expires => $expires, - domain => ".$LJ::DOMAIN", - ) if $cval; - BML::set_scheme($val); + BML::set_scheme( $val ); return 1; } diff -r 87b564b441db -r af46f441997b cgi-bin/LJ/User.pm --- a/cgi-bin/LJ/User.pm Thu Mar 10 11:27:54 2011 +0800 +++ b/cgi-bin/LJ/User.pm Thu Mar 10 12:05:10 2011 +0800 @@ -43,6 +43,7 @@ use DW::User::ContentFilters; use DW::User::ContentFilters; use DW::User::Edges; use DW::InviteCodes::Promo; +use DW::SiteScheme; use LJ::Community; use LJ::Subscription; @@ -8813,7 +8814,7 @@ sub make_journal { # render it in the lynx site scheme. if ( $stylearg eq 'light' ) { $fallback = 'bml'; - $r->note(bml_use_scheme => 'lynx'); + DW::SiteScheme->set_for_request( 'lynx' ); } # but if the user specifies which they want, override the fallback we picked --------------------------------------------------------------------------------