Changeset 473


Ignore:
Timestamp:
Sep 16, 2004, 7:12:48 PM (17 years ago)
Author:
kake
Message:

Changes since

Location:
trunk
Files:
1 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/MANIFEST

    r472 r473  
    5252t/12_macros.t
    5353t/13_cookies.t
     54t/14_recent_changes_cookies.t
    5455t/15_template.t
    5556t/21_rdf.t
  • trunk/lib/OpenGuides.pm

    r472 r473  
    77use CGI::Wiki::Plugin::GeoCache;
    88use CGI::Wiki::Plugin::Locator::UK;
     9use OpenGuides::CGI;
    910use OpenGuides::Template;
    1011use OpenGuides::Utils;
     12use Time::Piece;
    1113use URI::Escape;
    1214
     
    188190        my $minor_edits = $self->get_cookie( "show_minor_edits_in_rc" );
    189191        my %recent_changes;
    190         for my $days ( [0, 1], [1, 7], [7, 14], [14, 30] ) {
    191             my %criteria = ( between_days => $days );
     192        my $q = CGI->new;
     193        my $since = $q->param("since");
     194        if ( $since ) {
     195            $tt_vars{since} = $since;
     196            my $t = localtime($since); # overloaded by Time::Piece
     197            $tt_vars{since_string} = $t->strftime;
     198            my %criteria = ( since => $since );
    192199            $criteria{metadata_was} = { edit_type => "Normal edit" }
    193200              unless $minor_edits;
     
    209216                       } @rc;
    210217            if ( scalar @rc ) {
    211                 $recent_changes{$days->[1]} = \@rc;
    212             }
    213         }
     218                $recent_changes{since} = \@rc;
     219            }
     220        } else {
     221            for my $days ( [0, 1], [1, 7], [7, 14], [14, 30] ) {
     222                my %criteria = ( between_days => $days );
     223                $criteria{metadata_was} = { edit_type => "Normal edit" }
     224                  unless $minor_edits;
     225                my @rc = $self->{wiki}->list_recent_changes( %criteria );
     226
     227                @rc = map {
     228                {
     229                  name        => CGI->escapeHTML($_->{name}),
     230                  last_modified => CGI->escapeHTML($_->{last_modified}),
     231                  version     => CGI->escapeHTML($_->{version}),
     232                  comment     => CGI->escapeHTML($_->{metadata}{comment}[0]),
     233                  username    => CGI->escapeHTML($_->{metadata}{username}[0]),
     234                  host        => CGI->escapeHTML($_->{metadata}{host}[0]),
     235                  username_param => CGI->escape($_->{metadata}{username}[0]),
     236                  edit_type   => CGI->escapeHTML($_->{metadata}{edit_type}[0]),
     237                  url         => "$config->{_}->{script_name}?"
     238          . CGI->escape($wiki->formatter->node_name_to_node_param($_->{name})),
     239                }
     240                           } @rc;
     241                if ( scalar @rc ) {
     242                    $recent_changes{$days->[1]} = \@rc;
     243                }
     244            }
     245        }
    214246        $tt_vars{recent_changes} = \%recent_changes;
     247        my %processing_args = (
     248                                id            => $id,
     249                                template      => "recent_changes.tt",
     250                                tt_vars       => \%tt_vars,
     251                               );
     252        if ( !$since && $self->get_cookie("track_recent_changes_views") ) {
     253            my $cookie =
     254               OpenGuides::CGI->make_recent_changes_cookie(config => $config );
     255            $processing_args{cookies} = $cookie;
     256            $tt_vars{last_viewed} = OpenGuides::CGI->get_last_recent_changes_visit_from_cookie( config => $config );
     257        }
    215258        return %tt_vars if $args{return_tt_vars};
    216         my $output = $self->process_template(
    217                                           id            => $id,
    218                                           template      => "recent_changes.tt",
    219                                           tt_vars       => \%tt_vars,
    220                                             );
     259        my $output = $self->process_template( %processing_args );
    221260        return $output if $return_output;
    222261        print $output;
     
    651690                        template => $args{template},
    652691                        vars     => $args{tt_vars},
     692                        cookies  => $args{cookies},
    653693    );
    654694    if ( $args{content_type} ) {
  • trunk/lib/OpenGuides/CGI.pm

    r472 r473  
    1919=head1 SYNOPSIS
    2020
     21Saving preferences in a cookie:
     22
    2123  use Config::Tiny;
    2224  use OpenGuides::CGI;
     
    2729
    2830  my $cookie = OpenGuides::CGI->make_prefs_cookie(
    29       config                 => $config,
    30       username               => "Kake",
    31       include_geocache_link  => 1,
    32       preview_above_edit_box => 1,
    33       latlong_traditional    => 1,
    34       omit_help_links        => 1,
    35       show_minor_edits_in_rc => 1,
    36       default_edit_type      => "tidying",
    37       cookie_expires         => "never",
     31      config                     => $config,
     32      username                   => "Kake",
     33      include_geocache_link      => 1,
     34      preview_above_edit_box     => 1,
     35      latlong_traditional        => 1,
     36      omit_help_links            => 1,
     37      show_minor_edits_in_rc     => 1,
     38      default_edit_type          => "tidying",
     39      cookie_expires             => "never",
     40      track_recent_changes_views => 1,
    3841  );
    3942
     
    5053  );
    5154
     55Tracking visits to Recent Changes:
     56
     57  use Config::Tiny;
     58  use OpenGuides::CGI;
     59  use OpenGuides::Template;
     60  use OpenGuides::Utils;
     61
     62  my $config = Config::Tiny->read( "wiki.conf" );
     63
     64  my $cookie = OpenGuides::CGI->make_recent_changes_cookie(
     65      config => $config,
     66  );
     67
    5268=head1 METHODS
    5369
     
    5773
    5874  my $cookie = OpenGuides::CGI->make_prefs_cookie(
    59       config                 => $config,
    60       username               => "Kake",
    61       include_geocache_link  => 1,
    62       preview_above_edit_box => 1,
    63       latlong_traditional    => 1,
    64       omit_help_links        => 1,
    65       show_minor_edits_in_rc => 1,
    66       default_edit_type      => "tidying",
    67       cookie_expires         => "never",
     75      config                     => $config,
     76      username                   => "Kake",
     77      include_geocache_link      => 1,
     78      preview_above_edit_box     => 1,
     79      latlong_traditional        => 1,
     80      omit_help_links            => 1,
     81      show_minor_edits_in_rc     => 1,
     82      default_edit_type          => "tidying",
     83      cookie_expires             => "never",
     84      track_recent_changes_views => 1,
    6885  );
    6986
     
    107124                    defedit    => $args{default_edit_type} || "normal",
    108125                    exp        => $args{cookie_expires},
     126                    trackrc    => $args{track_recent_changes_views} || 0,
    109127                  },
    110128        -expires => $expires,
     
    135153        %data = $cookies{$cookie_name}->value; # call ->value in list context
    136154    }
    137     return ( username               => $data{user}      || "Anonymous",
    138              include_geocache_link  => $data{gclink}    || 0,
    139              preview_above_edit_box => $data{prevab}    || 0,
    140              latlong_traditional    => $data{lltrad}    || 0,
    141              omit_help_links        => $data{omithlplks}|| 0,
    142              show_minor_edits_in_rc => $data{rcmined}   || 0,
    143              default_edit_type      => $data{defedit}   || "normal",
    144              cookie_expires         => $data{exp}       || "month",
     155    return ( username                   => $data{user}       || "Anonymous",
     156             include_geocache_link      => $data{gclink}     || 0,
     157             preview_above_edit_box     => $data{prevab}     || 0,
     158             latlong_traditional        => $data{lltrad}     || 0,
     159             omit_help_links            => $data{omithlplks} || 0,
     160             show_minor_edits_in_rc     => $data{rcmined}    || 0,
     161             default_edit_type          => $data{defedit}    || "normal",
     162             cookie_expires             => $data{exp}        || "month",
     163             track_recent_changes_views => $data{trackrc}    || 0,
    145164           );
    146165}
     166
     167
     168=item B<make_recent_changes_cookie>
     169
     170  my $cookie = OpenGuides::CGI->make_recent_changes_cookie(
     171      config => $config,
     172  );
     173
     174Makes a cookie that stores the time now as the time of the latest
     175visit to Recent Changes.  Or, if C<clear_cookie> is specified and
     176true, makes a cookie with an expiration date in the past:
     177
     178  my $cookie = OpenGuides::CGI->make_recent_changes_cookie(
     179      config       => $config,
     180      clear_cookie => 1,
     181  );
     182
     183=cut
     184
     185sub make_recent_changes_cookie {
     186    my ($class, %args) = @_;
     187    my $config = $args{config} or croak "No config object supplied";
     188    croak "Config object not a Config::Tiny"
     189        unless UNIVERSAL::isa( $config, "Config::Tiny" );
     190    my $cookie_name = $class->_get_rc_cookie_name( config => $config );
     191    # See explanation of expiry date hack above in make_prefs_cookie.
     192    my $expires;
     193    if ( $args{clear_cookie} ) {
     194        $expires = "-1M";
     195    } else {
     196        $expires = "Thu, 31-Dec-2037 22:22:22 GMT";
     197    }
     198    my $cookie = CGI::Cookie->new(
     199        -name  => $cookie_name,
     200        -value => {
     201                    time => time,
     202                  },
     203        -expires => $expires,
     204    );
     205    return $cookie;
     206}
     207
     208
     209=item B<get_last_recent_changes_visit_from_cookie>
     210
     211  my %prefs = OpenGuides::CGI->get_last_recent_changes_visit_from_cookie(
     212      config => $config
     213  );
     214
     215Croaks unless a L<Config::Tiny> object is supplied as C<config>.
     216Returns the time (as seconds since epoch) of the user's last visit to
     217Recent Changes.
     218
     219=cut
     220
     221sub get_last_recent_changes_visit_from_cookie {
     222    my ($class, %args) = @_;
     223    my $config = $args{config} or croak "No config object supplied";
     224    croak "Config object not a Config::Tiny"
     225        unless UNIVERSAL::isa( $config, "Config::Tiny" );
     226    my %cookies = CGI::Cookie->fetch;
     227    my $cookie_name = $class->_get_rc_cookie_name( config => $config );
     228    my %data;
     229    if ( $cookies{$cookie_name} ) {
     230        %data = $cookies{$cookie_name}->value; # call ->value in list context
     231    }
     232    return $data{time};
     233}
     234
    147235
    148236sub _get_cookie_name {
     
    153241}
    154242
     243sub _get_rc_cookie_name {
     244    my ($class, %args) = @_;
     245    my $site_name = $args{config}->{_}->{site_name}
     246        or croak "No site name in config";
     247    return $site_name . "_last_rc_visit";
     248}
     249
    155250=back
    156251
  • trunk/preferences.cgi

    r472 r473  
    2424
    2525sub set_preferences {
    26     my $username     = $cgi->param("username") || "";
    27     my $gc_link      = $cgi->param("include_geocache_link")  || 0;
    28     my $pre_above    = $cgi->param("preview_above_edit_box") || 0;
    29     my $latlong_trad = $cgi->param("latlong_traditional")    || 0;
    30     my $omit_hlplnks = $cgi->param("omit_help_links")        || 0;
    31     my $rc_minor_eds = $cgi->param("show_minor_edits_in_rc") || 0;
    32     my $edit_type    = $cgi->param("default_edit_type") || "normal";
    33     my $expires      = $cgi->param("cookie_expires") || "month";
    34     my $cookie = OpenGuides::CGI->make_prefs_cookie(
     26    my $username     = $cgi->param("username")                   || "";
     27    my $gc_link      = $cgi->param("include_geocache_link")      || 0;
     28    my $pre_above    = $cgi->param("preview_above_edit_box")     || 0;
     29    my $latlong_trad = $cgi->param("latlong_traditional")        || 0;
     30    my $omit_hlplnks = $cgi->param("omit_help_links")            || 0;
     31    my $rc_minor_eds = $cgi->param("show_minor_edits_in_rc")     || 0;
     32    my $edit_type    = $cgi->param("default_edit_type")          || "normal";
     33    my $expires      = $cgi->param("cookie_expires")             || "month";
     34    my $track_rc     = $cgi->param("track_recent_changes_views") || 0;
     35    my $prefs_cookie = OpenGuides::CGI->make_prefs_cookie(
    3536        config => $config,
    3637        username => $username,
     
    4243        default_edit_type      => $edit_type,
    4344        cookie_expires         => $expires,
     45        track_recent_changes_views => $track_rc,
    4446    );
     47    my @cookies = ( $prefs_cookie );
     48    # If they've asked not to have their recent changes visits tracked,
     49    # clear any existing recentchanges cookie.
     50    if ( ! $track_rc ) {
     51        my $rc_cookie = OpenGuides::CGI->make_recent_changes_cookie(
     52            config       => $config,
     53            clear_cookie => 1,
     54        );
     55        push @cookies, $rc_cookie;
     56    }
    4557    print OpenGuides::Template->output(
    4658        wiki     => $wiki,
    4759        config   => $config,
    4860        template => "preferences.tt",
    49         cookies  => $cookie,
     61        cookies  => \@cookies,
    5062        vars     => {
    51                       not_editable           => 1,
    52                       username               => $username,
    53                       include_geocache_link  => $gc_link,
    54                       preview_above_edit_box => $pre_above,
    55                       latlong_traditional    => $latlong_trad,
    56                       omit_help_links        => $omit_hlplnks,
    57                       show_minor_edits_in_rc => $rc_minor_eds,
    58                       default_edit_type      => $edit_type,
    59                       cookie_expires         => $expires,
     63                      not_editable               => 1,
     64                      username                   => $username,
     65                      include_geocache_link      => $gc_link,
     66                      preview_above_edit_box     => $pre_above,
     67                      latlong_traditional        => $latlong_trad,
     68                      omit_help_links            => $omit_hlplnks,
     69                      show_minor_edits_in_rc     => $rc_minor_eds,
     70                      default_edit_type          => $edit_type,
     71                      cookie_expires             => $expires,
     72                      track_recent_changes_views => $track_rc,
    6073                    }
    6174    );
  • trunk/t/13_cookies.t

    r472 r473  
    44use Time::Piece;
    55use Time::Seconds;
    6 use Test::More tests => 18;
     6use Test::More tests => 19;
    77
    88eval { OpenGuides::CGI->make_prefs_cookie; };
     
    2121
    2222my $cookie = OpenGuides::CGI->make_prefs_cookie(
    23     config                 => $config,
    24     username               => "Kake",
    25     include_geocache_link  => 1,
    26     preview_above_edit_box => 1,
    27     latlong_traditional    => 1,
    28     omit_help_links        => 1,
    29     show_minor_edits_in_rc => 1,
    30     default_edit_type      => "tidying",
    31     cookie_expires         => "never",
     23    config                     => $config,
     24    username                   => "Kake",
     25    include_geocache_link      => 1,
     26    preview_above_edit_box     => 1,
     27    latlong_traditional        => 1,
     28    omit_help_links            => 1,
     29    show_minor_edits_in_rc     => 1,
     30    default_edit_type          => "tidying",
     31    cookie_expires             => "never",
     32    track_recent_changes_views => 1,
    3233);
    3334isa_ok( $cookie, "CGI::Cookie", "->make_prefs_cookie returns a cookie" );
     
    6566is( $prefs{default_edit_type}, "tidying", "...and default edit prefs" );
    6667is( $prefs{cookie_expires}, "never", "...and requested cookie expiry" );
     68ok( $prefs{track_recent_changes_views}, "...and recent changes tracking" );
    6769
    6870# Check that cookie parsing fails nicely if no cookie set.
     
    7072%prefs = eval { OpenGuides::CGI->get_prefs_from_cookie( config => $config ); };
    7173is( $@, "", "->get_prefs_from_cookie doesn't die if no cookie set" );
    72 is( keys %prefs, 8, "...and returns eight default values" );
     74is( keys %prefs, 9, "...and returns nine default values" );
  • trunk/templates/preferences.tt

    r472 r473  
    6666    [% END %]
    6767    <label for="show_minor">Include &#8220;minor edits&#8221; in Recent Changes.</label>
     68    </p>
     69
     70    <p>
     71      [% IF track_recent_changes_views %]
     72        <input type="checkbox" id="track_recent_changes_views" name="track_recent_changes_views" value="1" checked="1" />
     73      [% ELSE %]
     74        <input type="checkbox" id="track_recent_changes_views" name="track_recent_changes_views" value="1" />
     75      [% END %]
     76      <label for="track_recent_changes_views">Track my visits to Recent Changes and offer me a link for &#8220;changes since I last viewed Recent Changes&#8221;.</label>
    6877    </p>
    6978
     
    139148  included in Recent Changes.</p>
    140149
     150  <p>Your visits to Recent Changes will
     151    [% UNLESS track_recent_changes_views %] not [% END %]
     152  be tracked.</p>
     153
    141154  <p>Default edit type set to
    142155    [% IF default_edit_type == 'normal' %]
  • trunk/templates/recent_changes.tt

    r472 r473  
    55  [% INCLUDE navbar.tt %]
    66  <h2>Recent site changes</h2>
    7   [% content %]
     7  [% UNLESS since %]
     8    [% content %]
     9  [% END %]
     10
     11  [% IF last_viewed %]
     12    <p><a href="[% full_cgi_url %]?id=RecentChanges;since=[% last_viewed %]">View changes since your last visit to Recent Changes</a>.</p>
     13  [% ELSIF since %]
     14    <p><a href="[% full_cgi_url %]?id=RecentChanges">View the regular Recent Changes page</a>.</p>
     15  [% END %]
    816
    917  [% BLOCK changes %]
     
    4048  [% END %]
    4149
    42 [% IF recent_changes.1 %]
    43   <h2>Pages changed in the last 24 hours:</h2>
    44   [% INCLUDE changes nodes = recent_changes.1 days = 1 %]
    45 [% END %]
     50[% IF since %]
     51  <h2>Pages changed since [% since_string %]:</h2>
     52  [% IF recent_changes.since %]
     53    [% INCLUDE changes nodes = recent_changes.since days = 'since' %]
     54  [% ELSE %]
     55    <p>No changes made since [% since_string %].</p>
     56  [% END %]
     57[% ELSE %]
    4658
    47 [% IF recent_changes.7 %]
    48   <h2>Pages changed in the last week:</h2>
    49   [% INCLUDE changes nodes = recent_changes.7 days = 7 %]
    50 [% END %]
     59  [% IF recent_changes.1 %]
     60    <h2>Pages changed in the last 24 hours:</h2>
     61    [% INCLUDE changes nodes = recent_changes.1 days = 1 %]
     62  [% END %]
    5163
    52 [% IF recent_changes.14 %]
    53   <h2>Pages changed in the last fortnight:</h2>
    54   [% INCLUDE changes nodes = recent_changes.14 days = 14 %]
    55 [% END %]
     64  [% IF recent_changes.7 %]
     65    <h2>Pages changed in the last week:</h2>
     66    [% INCLUDE changes nodes = recent_changes.7 days = 7 %]
     67  [% END %]
    5668
    57 [% IF recent_changes.30 %]
    58   <h2>Pages changed in the last 30 days:</h2>
    59   [% INCLUDE changes nodes = recent_changes.30 days = 30 %]
     69  [% IF recent_changes.14 %]
     70    <h2>Pages changed in the last fortnight:</h2>
     71    [% INCLUDE changes nodes = recent_changes.14 days = 14 %]
     72  [% END %]
     73
     74  [% IF recent_changes.30 %]
     75    <h2>Pages changed in the last 30 days:</h2>
     76    [% INCLUDE changes nodes = recent_changes.30 days = 30 %]
     77  [% END %]
     78
    6079[% END %]
    6180
Note: See TracChangeset for help on using the changeset viewer.