174 lines
5 KiB
Perl
174 lines
5 KiB
Perl
|
|
#!/usr/bin/perl
|
||
|
|
#
|
||
|
|
# DW::Controller::MoodList
|
||
|
|
#
|
||
|
|
# View all images in a mood theme, or a list of public mood themes.
|
||
|
|
#
|
||
|
|
# Authors:
|
||
|
|
# Jen Griffin <kareila@livejournal.com>
|
||
|
|
#
|
||
|
|
# Copyright (c) 2020 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::Controller::MoodList;
|
||
|
|
|
||
|
|
use strict;
|
||
|
|
|
||
|
|
use DW::Routing;
|
||
|
|
use DW::Controller;
|
||
|
|
use DW::Template;
|
||
|
|
|
||
|
|
use DW::Mood;
|
||
|
|
|
||
|
|
use POSIX qw( ceil );
|
||
|
|
|
||
|
|
DW::Routing->register_string( '/moodlist', \&main_handler, app => 1 );
|
||
|
|
|
||
|
|
sub main_handler {
|
||
|
|
my ( $ok, $rv ) = controller();
|
||
|
|
return $rv unless $ok;
|
||
|
|
|
||
|
|
my $r = $rv->{r};
|
||
|
|
my $args = $r->get_args;
|
||
|
|
my $vars = {};
|
||
|
|
|
||
|
|
{ # initial setup for all page templates - mood info and visible themes
|
||
|
|
|
||
|
|
my $moods = DW::Mood->get_moods;
|
||
|
|
my @mlist = map { $moods->{$_} }
|
||
|
|
sort { $moods->{$a}->{name} cmp $moods->{$b}->{name} } keys %$moods;
|
||
|
|
|
||
|
|
my @themes = DW::Mood->public_themes;
|
||
|
|
@themes = sort { lc( $a->{name} ) cmp lc( $b->{name} ) } @themes;
|
||
|
|
|
||
|
|
$vars->{moods} = $moods;
|
||
|
|
$vars->{mlist} = \@mlist;
|
||
|
|
$vars->{themes} = \@themes;
|
||
|
|
}
|
||
|
|
|
||
|
|
# image loading helper sub for all pages
|
||
|
|
# args: theme id, mood name
|
||
|
|
$vars->{load_image} = sub {
|
||
|
|
my $tobj = DW::Mood->new( $_[0] );
|
||
|
|
return {} unless $tobj;
|
||
|
|
|
||
|
|
my %pic;
|
||
|
|
$tobj->get_picture( $tobj->mood_id( $_[1] ), \%pic );
|
||
|
|
return \%pic;
|
||
|
|
};
|
||
|
|
|
||
|
|
unless ( defined $args->{moodtheme} ) {
|
||
|
|
|
||
|
|
{ # calculate pagination
|
||
|
|
my $page = int( $args->{page} || 0 ) || 1;
|
||
|
|
my $page_size = 15;
|
||
|
|
my $first = ( $page - 1 ) * $page_size;
|
||
|
|
my $total = scalar( @{ $vars->{themes} } );
|
||
|
|
|
||
|
|
my $total_pages = POSIX::ceil( $total / $page_size );
|
||
|
|
|
||
|
|
my $last = $page_size * $page - 1;
|
||
|
|
if ( $last >= $total ) {
|
||
|
|
$last = $total - 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
$vars->{pages} = {
|
||
|
|
current => $page,
|
||
|
|
total_pages => $total_pages,
|
||
|
|
first_item => $first,
|
||
|
|
last_item => $last,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
# see if the user changed the shown moods
|
||
|
|
|
||
|
|
if ( $args->{theme1} && $args->{theme2} && $args->{theme3} && $args->{theme4} ) {
|
||
|
|
$vars->{show_moods} =
|
||
|
|
[ $args->{theme1}, $args->{theme2}, $args->{theme3}, $args->{theme4} ];
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
$vars->{show_moods} = [qw( happy sad angry tired )];
|
||
|
|
}
|
||
|
|
|
||
|
|
$vars->{mood_select} = [ map { $_->{name}, $_->{name} } @{ $vars->{mlist} } ];
|
||
|
|
|
||
|
|
return DW::Template->render_template( 'mood/index.tt', $vars );
|
||
|
|
}
|
||
|
|
|
||
|
|
# from here, we want to view all the images for a given mood theme
|
||
|
|
|
||
|
|
$vars->{themeid} = $args->{moodtheme};
|
||
|
|
|
||
|
|
{ # load any non-public themes from the specified owner
|
||
|
|
|
||
|
|
my @user_themes;
|
||
|
|
my $remote = $rv->{remote};
|
||
|
|
|
||
|
|
# Check if the (non-system) user is logged in and didn't specify an owner.
|
||
|
|
# If so, append their private mood themes.
|
||
|
|
if ( ( $remote->user ne 'system' ) && !$args->{ownerid} ) {
|
||
|
|
@user_themes = DW::Mood->get_themes( { ownerid => $remote->id } );
|
||
|
|
}
|
||
|
|
elsif ( $args->{ownerid} ) {
|
||
|
|
@user_themes = DW::Mood->get_themes(
|
||
|
|
{
|
||
|
|
themeid => $args->{moodtheme},
|
||
|
|
ownerid => $args->{ownerid}
|
||
|
|
}
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
$vars->{user_themes} = [ sort { lc( $a->{name} ) cmp lc( $b->{name} ) } @user_themes ];
|
||
|
|
}
|
||
|
|
|
||
|
|
my $scope = '/mood/index.tt';
|
||
|
|
|
||
|
|
# see if the user can even view this theme
|
||
|
|
my $theme = ( grep { $_->{moodthemeid} == $args->{moodtheme} }
|
||
|
|
( @{ $vars->{themes} }, @{ $vars->{user_themes} } ) )[0];
|
||
|
|
|
||
|
|
return error_ml("$scope.error.cantviewtheme") unless $theme;
|
||
|
|
|
||
|
|
if ( $args->{ownerid} ) {
|
||
|
|
$vars->{ownerinfo} = sprintf( "%s - %s",
|
||
|
|
LJ::ehtml( $theme->{name} ),
|
||
|
|
LJ::ljuser( LJ::get_username( $args->{ownerid} ) ) );
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
$vars->{theme_select} = [
|
||
|
|
( map { $_->{moodthemeid}, $_->{name} } @{ $vars->{themes} } ),
|
||
|
|
( @{ $vars->{user_themes} } ? ( 0, "---" ) : () ),
|
||
|
|
( map { $_->{moodthemeid}, $_->{name} } @{ $vars->{user_themes} } )
|
||
|
|
];
|
||
|
|
}
|
||
|
|
|
||
|
|
# Does the user want the table format, or the tree format?
|
||
|
|
|
||
|
|
return DW::Template->render_template( 'mood/table.tt', $vars )
|
||
|
|
unless defined $args->{mode} && $args->{mode} eq 'tree';
|
||
|
|
|
||
|
|
$vars->{mode} = 'tree';
|
||
|
|
|
||
|
|
my %lists = ();
|
||
|
|
|
||
|
|
foreach (
|
||
|
|
sort { $vars->{moods}->{$a}->{name} cmp $vars->{moods}->{$b}->{name} }
|
||
|
|
keys %{ $vars->{moods} }
|
||
|
|
)
|
||
|
|
{
|
||
|
|
my $m = $vars->{moods}->{$_};
|
||
|
|
$lists{ $m->{'parent'} } //= [];
|
||
|
|
push @{ $lists{ $m->{'parent'} } }, $m;
|
||
|
|
}
|
||
|
|
|
||
|
|
$vars->{lists} = \%lists;
|
||
|
|
|
||
|
|
return DW::Template->render_template( 'mood/tree.tt', $vars );
|
||
|
|
}
|
||
|
|
|
||
|
|
1;
|