Files
racalmas/lib/calcms/aggregator.pm

226 lines
7.4 KiB
Perl

package aggregator;
use strict;
use warnings;
no warnings 'redefine';
use events();
use comments();
use calendar();
use project();
use Date::Calc;
our @EXPORT_OK = qw(get_cache configure_cache put_cache get_list check_params);
sub get_list($$) {
my ($config, $request) = @_;
my $params = $request->{params}->{checked};
#customize prefiltered request parameters
$request->{params}->{original}->{date} = $request->{params}->{checked}->{date};
if ( $params->{event_id} ne '' ) {
$request->{params}->{original}->{template} = 'event_details.html';
} else {
$request->{params}->{original}->{template} = 'event_list.html';
}
$request->{params}->{checked} = events::check_params( $config, $request->{params}->{original} );
my $content = '';
my $results = events::get( $config, $request );
events::render( $content, $config, $request, $results );
#set url to embed as last loaded url in javascript
my $date = $params->{date} || '';
$date = 'heute' if $params->{date} eq 'today';
$date = $results->[0]->{day} if $params->{event_id} ne '';
my $url = $config->{controllers}->{events} . '/' . $params->{from_date} . '/' . $params->{till_date};
#count most projects
my $used_projects = {};
for my $result (@$results) {
my $project = $result->{project_title} || '';
$used_projects->{$project}++;
}
my @used_projects = reverse sort { $used_projects->{$a} <=> $used_projects->{$b} } ( keys %$used_projects );
my $most_used_project = $used_projects[0];
return {
day => $results->[0]->{day},
start_datetime => $results->[0]->{start_datetime},
event_id => $results->[0]->{event_id},
program => $results->[0]->{program},
project_title => $most_used_project,
series_name => $results->[0]->{series_name},
title => $results->[0]->{title},
content => $content,
results => $results,
url => $url,
};
}
sub get_menu($$$$) {
my ($config, $request, $date, $results) = @_;
my $params = $request->{params}->{checked};
#load details only on demand
if ( $params->{event_id} ne '' ) {
$request->{params}->{original}->{template} = 'event_menu.html';
$request->{params}->{original}->{event_id} = undef;
$request->{params}->{original}->{date} = $date;
$request->{params}->{checked} = events::check_params( $config, $request->{params}->{original} );
$results = events::get( $config, $request );
} else {
$request->{params}->{checked}->{template} = template::check( $config, 'event_menu.html' );
}
#events menu
my $output = '';
events::render( $output, $config, $request, $results );
return { content => $output };
}
sub get_calendar($$$) {
my ($config, $request, $date) = @_;
my $params = $request->{params}->{checked};
$request->{params}->{original}->{template} = 'calendar.html';
$request->{params}->{original}->{date} = $date if defined $date;
$request->{params}->{checked} = calendar::check_params( $config, $request->{params}->{original} );
$params = $request->{params}->{checked};
#set query string for caching
my $options = [];
push @$options, 'date=' . $params->{date} if $params->{date} ne '';
push @$options, 'from_date=' . $params->{from_date} if $params->{from_date} ne '';
push @$options, 'till_date=' . $params->{till_date} if $params->{till_date} ne '';
$ENV{QUERY_STRING} = '' . join( "&", @$options );
my $content = '';
calendar::get_cached_or_render( $content, $config, $request );
return { content => $content };
}
sub get_newest_comments($$) {
my ($config, $request) = @_;
my $params = {
template => 'comments_newest.html',
limit => 10,
type => 'list',
show_max => 3
};
$request = {
url => $ENV{QUERY_STRING},
params => {
original => $params,
checked => comments::check_params( $config, $params ),
},
config => $config,
connection => $request->{connection}
};
my $content = '';
comments::get_cached_or_render( $content, $config, $request );
return { content => $content };
}
sub check_params($$) {
my ($config, $params) = @_;
#get start and stop from projects
my $range = project::get_date_range($config);
my $start_date = $range->{start_date};
my $end_date = $range->{end_date};
#filter for date
my $date = time::check_date( $params->{date} );
$date = time::time_to_date( time() ) if $date eq '';
$date = time::get_event_date($config) if $date eq 'today';
$date = $start_date if $date lt $start_date;
$date = $end_date if $date gt $end_date;
#filter for date
my $time = time::check_time( $params->{time} );
if ( ( defined $params->{today} ) && ( $params->{today} eq '1' ) ) {
$date = time::time_to_date( time() );
$params->{date} = $date;
}
if (defined $params->{month}){
if ($params->{month} eq 'this') {
my ($y, $m) = split /-/, time::time_to_date();
$params->{from_date} = time::datetime_to_date("$y-$m-01");
$params->{till_date} = time::datetime_to_date("$y-$m-".Date::Calc::Days_in_Month($y,$m));
} elsif (my ($y, $m) = $params->{month} =~ m/^(\d\d\d\d)-(\d\d)$/) {
if ($m) {
$params->{from_date} = time::datetime_to_date("$y-$m-01");
$params->{till_date} = time::datetime_to_date("$y-$m-".Date::Calc::Days_in_Month($y,$m));
}
}
}
my $from_date = time::check_date( $params->{from_date} );
my $till_date = time::check_date( $params->{till_date} );
my $previous_series = $params->{previous_series} || '';
if ( ($previous_series) && ( $previous_series =~ /(\d+)/ ) ) {
$params->{event_id} = events::get_previous_event_of_series(
undef, $config,
{
event_id => $1,
exclude_projects => 1,
exclude_locations => 1,
}
);
}
my $next_series = $params->{next_series} || '';
if ( ($next_series) && ( $next_series =~ /(\d+)/ ) ) {
$params->{event_id} = events::get_next_event_of_series(
undef, $config,
{
event_id => $1,
exclude_projects => 1,
exclude_locations => 1,
}
);
}
my $event_id = $params->{event_id} || '';
unless ( $event_id eq '' ) {
if ( $event_id =~ /(\d+)/ ) {
$event_id = $1;
} else {
log::error( $config, "invalid event_id" );
}
}
#set query string for caching
if ( ( !exists $ENV{QUERY_STRING} ) || ( $ENV{QUERY_STRING} eq '' ) ) {
my $options = [];
push @$options, 'date=' . $date if $date ne '';
push @$options, 'from_date=' . $from_date if $from_date ne '';
push @$options, 'till_date=' . $till_date if $till_date ne '';
push @$options, 'event_id=' . $event_id if $event_id ne '';
$ENV{QUERY_STRING} = '' . join( "&", @$options );
}
return {
date => $date,
time => $time,
from_date => $from_date,
till_date => $till_date,
event_id => $event_id,
ro => $params->{ro}//'' ? 1 : 0
};
}
#do not delete last line!
1;