diff --git a/lib/calcms/series.pm b/lib/calcms/series.pm index 999dba2..eb0facc 100644 --- a/lib/calcms/series.pm +++ b/lib/calcms/series.pm @@ -1158,6 +1158,57 @@ sub is_event_assigned_to_user ($$) { return 1; } +sub get_rebuilt_episodes ($$) { + my $config = shift; + my $options = shift; + + return "missing project_id" unless defined $options->{project_id}; + return "missing studio_id" unless defined $options->{studio_id}; + return "missing series_id" unless defined $options->{series_id}; + + # ignore project and studio as series can be used in multiple studios + my $events = series::get_events( + $config, + { + #project_id => $options->{project_id}, + #studio_id => $options->{studio_id}, + series_id => $options->{series_id}, + draft => 0 + } + ); + @$events = sort { $a->{start} cmp $b->{start} } @$events; + + my $events_by_episode = {}; + for my $event (@$events) { + next unless $event->{episode}; + push @{ $events_by_episode->{$event->{episode}} }, $event; + } + + my $done={}; + my $episode = $events->[0]->{episode} // 0; + $episode-=1; + + for my $i (0..$#$events){ + my $event = $events->[$i]; + next if $done->{$event->{id}}; + $episode++; + # increase episode for not set values + if ( ($event->{episode}//'') eq ''){ + $event->{old_episode} = $event->{episode}; + $event->{episode} = $episode; + next; + } + # set new value to all episodes with same value + for my $event2 (@{$events_by_episode->{$event->{episode}}}){ + $event2->{old_episode} = $event2->{episode}; + $event2->{episode} = $episode; + $done->{$event2->{id}}=1; + }; + } + #print STDERR Dumper($events); + return $events; +} + # to find multiple recurrences this does not include the recurrence_count # use events::get_key to add the recurrence sub get_event_key ($) { @@ -1191,8 +1242,8 @@ sub update_recurring_events ($$) { my $events = series::get_events( $config, { - project_id => $options->{project_id}, - studio_id => $options->{studio_id}, + #project_id => $options->{project_id}, + #studio_id => $options->{studio_id}, series_id => $options->{series_id}, draft => 0 } @@ -1209,7 +1260,7 @@ sub update_recurring_events ($$) { } # handle all events with the same key - for my $key ( keys %$events_by_key ) { + for my $key ( sort keys %$events_by_key ) { my $events = $events_by_key->{$key}; next unless scalar @$events > 0; @@ -1219,8 +1270,6 @@ sub update_recurring_events ($$) { my $event = $events->[0]; next if $event->{recurrence} == 0; next if $event->{recurrence_count} == 0; - print STDERR -"remove recurrence\t'$event->{event_id}'\t'$event->{start}'\t'$event->{rerun}'\t'$event->{recurrence}'\t'$event->{key}'\n"; $event->{recurrence} = 0; $event->{recurrence_count} = 0; $event->{rerun} = 0; @@ -1232,14 +1281,10 @@ sub update_recurring_events ($$) { # first event is the original my $event = $events->[0]; my $originalId = $event->{event_id}; - print STDERR -"0\t'$event->{recurrence_count}'\t'$event->{event_id}'\t'$event->{start}'\t'$event->{rerun}'\t'$event->{recurrence}'\t'$event->{key}'\n"; # succeeding events are reruns for ( my $c = 1 ; $c < scalar(@$events) ; $c++ ) { my $event = $events->[$c]; - print STDERR -"$c\t'$event->{recurrence_count}'\t'$event->{event_id}'\t'$event->{start}'\t'$event->{rerun}'\t'$event->{recurrence}'\t'$event->{key}'\n"; my $update = 0; $update = 1 if $event->{recurrence} ne $originalId; diff --git a/lib/calcms/series_events.pm b/lib/calcms/series_events.pm index e912d60..4a6ccd7 100644 --- a/lib/calcms/series_events.pm +++ b/lib/calcms/series_events.pm @@ -41,8 +41,6 @@ sub save_content($$) { my $config = shift; my $entry = shift; - my $dbh = db::connect($config); - return undef unless ( defined $entry->{id} ); for my $attr ( keys %$entry ) { @@ -100,15 +98,35 @@ sub save_content($$) { where id=? }; - #print STDERR "update:".$query.Dumper(\@bind_values); + my $dbh = db::connect($config); my $result = db::put( $dbh, $query, \@bind_values ); unless ( defined $result ) { print STDERR "error on updating event\n"; return undef; } - #print STDERR "result=$result\n"; - #print STDERR "entr after update".Dumper($entry); + return $entry; +} + +sub set_episode{ + my $config = shift; + my $entry = shift; + + return undef unless ( defined $entry->{id} ); + return undef unless ( defined $entry->{episode} ); + + my $query = qq{ + update calcms_events + set episode=? + where id=? + }; + my $bind_values= [ $entry->{episode}, $entry->{id} ]; + my $dbh = db::connect($config); + my $result = db::put( $dbh, $query, $bind_values ); + unless ( defined $result ) { + print STDERR "error on setting episode in event\n"; + return undef; + } return $entry; } diff --git a/website/agenda/planung/calendar.cgi b/website/agenda/planung/calendar.cgi index 7b1ca8b..e1ad26b 100755 --- a/website/agenda/planung/calendar.cgi +++ b/website/agenda/planung/calendar.cgi @@ -109,6 +109,7 @@ if ( + }; } } diff --git a/website/agenda/planung/pot/de/series.po b/website/agenda/planung/pot/de/series.po index a567384..e1db460 100644 --- a/website/agenda/planung/pot/de/series.po +++ b/website/agenda/planung/pot/de/series.po @@ -22,6 +22,9 @@ msgstr "Alte Sendereihen" msgid "button_show_changes" msgstr "Änderungen" +msgid "button_rebuild_episodes" +msgstr "Episoden neuzählen" + msgid "label_name" msgstr "Name" diff --git a/website/agenda/planung/pot/en/series.po b/website/agenda/planung/pot/en/series.po index 942d4f1..26c1642 100644 --- a/website/agenda/planung/pot/en/series.po +++ b/website/agenda/planung/pot/en/series.po @@ -22,6 +22,9 @@ msgstr "old series" msgid "button_show_changes" msgstr "changes" +msgid "button_rebuild_episodes" +msgstr "recount episodes" + msgid "label_name" msgstr "name" diff --git a/website/agenda/planung/series.cgi b/website/agenda/planung/series.cgi index 75153f7..8e472bd 100755 --- a/website/agenda/planung/series.cgi +++ b/website/agenda/planung/series.cgi @@ -93,14 +93,20 @@ if ( defined $params->{action} ) { my $result = reassign_event( $config, $request ); return if defined $result; } + if ($params->{action} eq 'rebuild_episodes'){ + rebuild_episodes($config, $request); + return; + }; + if ($params->{action} eq 'set_rebuilt_episodes'){ + set_rebuilt_episodes($config, $request); + return; + }; # save_scan ($config, $request) if ($params->{action} eq 'save_scan'); } $config->{access}->{write} = 0; -#print STDERR "show_series\n"; - if ( defined $params->{series_id} ) { print q{} unless params::isJson(); show_series( $config, $request ); @@ -111,6 +117,7 @@ if ( defined $params->{series_id} ) { } unless params::isJson(); list_series( $config, $request ); } + return; #insert or update a schedule and update all schedule dates @@ -351,7 +358,6 @@ sub save_series { return; } - #print STDERR Dumper($entry); my $series_ids = series::get( $config, { @@ -1224,6 +1230,160 @@ sub show_series { template::process( $config, 'print', $params->{template}, $params ); } +sub set_rebuilt_episodes{ + my $config = shift; + my $request = shift; + + $config->{access}->{write} = 0; + + my $params = $request->{params}->{checked}; + my $permissions = $request->{permissions}; + unless ( $permissions->{read_series} == 1 ) { + uac::permissions_denied('read_series'); + return; + } + + for my $param ( 'project_id', 'studio_id', 'series_id' ) { + unless ( defined $params->{$param} ) { + uac::print_error("missing $param"); + return; + } + } + + unless ( project::is_series_assigned( $config, $params ) == 1 ) { + uac::print_error('series is not assigned to project!'); + return undef; + } + + #this will be updated later (especially allow_update_events) + for my $permission ( keys %{ $request->{permissions} } ) { + $params->{'allow'}->{$permission} = $request->{permissions}->{$permission}; + } + + my $project_id = $params->{project_id}; + my $studio_id = $params->{studio_id}; + my $series_id = $params->{series_id}; + my $events = series::get_rebuilt_episodes( $config, { + project_id => $project_id, + studio_id => $studio_id, + series_id => $series_id + }); + + my $updates = 0; + for my $event (@$events){ + next if $event->{project_id} ne $project_id; + next if $event->{studio_id} ne $studio_id; + next if $event->{old_episode} eq $event->{episode}; + series_events::set_episode( $config, { + id => $event->{id}, + episode => $event->{episode} + }); + $updates++; + } + print "$updates changes done.\n"; +} + +sub rebuild_episodes{ + my $config = shift; + my $request = shift; + + $config->{access}->{write} = 0; + + my $params = $request->{params}->{checked}; + my $permissions = $request->{permissions}; + unless ( $permissions->{read_series} == 1 ) { + uac::permissions_denied('read_series'); + return; + } + + for my $param ( 'project_id', 'studio_id', 'series_id' ) { + unless ( defined $params->{$param} ) { + uac::print_error("missing $param"); + return; + } + } + + unless ( project::is_series_assigned( $config, $params ) == 1 ) { + uac::print_error('series is not assigned to project!'); + return undef; + } + + #this will be updated later (especially allow_update_events) + for my $permission ( keys %{ $request->{permissions} } ) { + $params->{'allow'}->{$permission} = $request->{permissions}->{$permission}; + } + + my $project_id = $params->{project_id}; + my $studio_id = $params->{studio_id}; + my $series_id = $params->{series_id}; + my $events = series::get_rebuilt_episodes( $config, { + project_id => $project_id, + studio_id => $studio_id, + series_id => $series_id + }); + + my $events_by_id={}; + for my $event (@$events){ + $events_by_id->{$event->{id}} = $event; + } + + print " + "; + + my $prev=undef; + my $max_episode=0; + my $changes=0; + my $errors=0; + for my $event (@$events){ + $max_episode = $event->{episode} if $event->{episode} > $max_episode; + my $e1 = $event->{old_episode} //''; + my $e2 = $event->{episode} //''; + my $o1 = $prev->{old_episode} //''; + my $o2 = $prev->{episode} //''; + if ($e1 eq $e2){ + $event->{class} = 'ok'; + }else{ + $changes++; + $event->{class} = 'warn'; + } + if ($e1 and $e2 and $o1 and $o2 and ( ($e2-$o2) != ($e1-$o1) ) ){ + $event->{class} = "error" if $e1 ne $e2; + $prev->{class} = "error" if defined $prev and $o1 ne $o2; + $errors++; + } + if ($event->{episode} < $max_episode and !$event->{recurrence}){ + $event->{class} = "error"; + $errors++; + } + $event->{recurrence_start} = $events_by_id->{$event->{recurrence}}->{start}; + $event->{recurrence} = '-' unless $event->{recurrence}; + $prev = $event; + } + print "$errors errors, $changes changes\n"; + if ( ($changes>0) and ($errors==0) ){ + my $url = "series.cgi?action=set_rebuilt_episodes&project_id=$project_id&studio_id=$studio_id&series_id=$series_id"; + print qq{}; + } + my @cols=qw(id start series_name title episode old_episode recurrence recurrence_start project_name studio_name); + print "\n"; + print "" . join ("", map { "" } @cols) . "\n" ; + + for my $event (@$events){ + print qq{} + . join ("", map { "" } @cols) + . "\n"; + } + print "
".($_ // '-')."
".($event->{$_}//'-')."
\n"; +} + sub check_params { my $config = shift; my $params = shift; @@ -1239,16 +1399,14 @@ sub check_params { #actions and roles $checked->{action} = ''; if ( defined $params->{action} ) { - if ( $params->{action} =~ -/^(add_user|remove_user|create|delete|save|details|show|save_schedule|delete_schedule|save_scan|scan_events|assign_event|unassign_event|reassign_event)$/ - ) - { - $checked->{action} = $params->{action}; - } + $checked->{action} = $params->{action} if $params->{action} =~ +/^(add_user|remove_user|create|delete|save|details|show|save_schedule|delete_schedule|save_scan|scan_events|assign_event|unassign_event|reassign_event|rebuild_episodes|set_rebuilt_episodes)$/ + ; } #numeric values $checked->{exclude} = 0; + $checked->{action} = $params->{action}; for my $param ( 'id', 'project_id', 'studio_id', 'default_studio_id', 'user_id', 'new_series_id', 'series_id', 'schedule_id', diff --git a/website/agenda/planung/templates/edit-series.html b/website/agenda/planung/templates/edit-series.html index 73b2064..9dabc9d 100644 --- a/website/agenda/planung/templates/edit-series.html +++ b/website/agenda/planung/templates/edit-series.html @@ -56,6 +56,16 @@ + + +
+ + + + +
+
+