revision and fix episode numbers
episodes can be checked and fixed. On checking errors and warnings are displayed. Once only warnings exist, episodes can be fixed.
This commit is contained in:
@@ -1158,6 +1158,57 @@ sub is_event_assigned_to_user ($$) {
|
|||||||
return 1;
|
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
|
# to find multiple recurrences this does not include the recurrence_count
|
||||||
# use events::get_key to add the recurrence
|
# use events::get_key to add the recurrence
|
||||||
sub get_event_key ($) {
|
sub get_event_key ($) {
|
||||||
@@ -1191,8 +1242,8 @@ sub update_recurring_events ($$) {
|
|||||||
my $events = series::get_events(
|
my $events = series::get_events(
|
||||||
$config,
|
$config,
|
||||||
{
|
{
|
||||||
project_id => $options->{project_id},
|
#project_id => $options->{project_id},
|
||||||
studio_id => $options->{studio_id},
|
#studio_id => $options->{studio_id},
|
||||||
series_id => $options->{series_id},
|
series_id => $options->{series_id},
|
||||||
draft => 0
|
draft => 0
|
||||||
}
|
}
|
||||||
@@ -1209,7 +1260,7 @@ sub update_recurring_events ($$) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# handle all events with the same key
|
# 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};
|
my $events = $events_by_key->{$key};
|
||||||
next unless scalar @$events > 0;
|
next unless scalar @$events > 0;
|
||||||
|
|
||||||
@@ -1219,8 +1270,6 @@ sub update_recurring_events ($$) {
|
|||||||
my $event = $events->[0];
|
my $event = $events->[0];
|
||||||
next if $event->{recurrence} == 0;
|
next if $event->{recurrence} == 0;
|
||||||
next if $event->{recurrence_count} == 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} = 0;
|
||||||
$event->{recurrence_count} = 0;
|
$event->{recurrence_count} = 0;
|
||||||
$event->{rerun} = 0;
|
$event->{rerun} = 0;
|
||||||
@@ -1232,14 +1281,10 @@ sub update_recurring_events ($$) {
|
|||||||
# first event is the original
|
# first event is the original
|
||||||
my $event = $events->[0];
|
my $event = $events->[0];
|
||||||
my $originalId = $event->{event_id};
|
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
|
# succeeding events are reruns
|
||||||
for ( my $c = 1 ; $c < scalar(@$events) ; $c++ ) {
|
for ( my $c = 1 ; $c < scalar(@$events) ; $c++ ) {
|
||||||
my $event = $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;
|
my $update = 0;
|
||||||
$update = 1 if $event->{recurrence} ne $originalId;
|
$update = 1 if $event->{recurrence} ne $originalId;
|
||||||
|
|||||||
@@ -41,8 +41,6 @@ sub save_content($$) {
|
|||||||
my $config = shift;
|
my $config = shift;
|
||||||
my $entry = shift;
|
my $entry = shift;
|
||||||
|
|
||||||
my $dbh = db::connect($config);
|
|
||||||
|
|
||||||
return undef unless ( defined $entry->{id} );
|
return undef unless ( defined $entry->{id} );
|
||||||
|
|
||||||
for my $attr ( keys %$entry ) {
|
for my $attr ( keys %$entry ) {
|
||||||
@@ -100,15 +98,35 @@ sub save_content($$) {
|
|||||||
where id=?
|
where id=?
|
||||||
};
|
};
|
||||||
|
|
||||||
#print STDERR "update:".$query.Dumper(\@bind_values);
|
my $dbh = db::connect($config);
|
||||||
my $result = db::put( $dbh, $query, \@bind_values );
|
my $result = db::put( $dbh, $query, \@bind_values );
|
||||||
unless ( defined $result ) {
|
unless ( defined $result ) {
|
||||||
print STDERR "error on updating event\n";
|
print STDERR "error on updating event\n";
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
#print STDERR "result=$result\n";
|
return $entry;
|
||||||
#print STDERR "entr after update".Dumper($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;
|
return $entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -109,6 +109,7 @@ if (
|
|||||||
<!--<link href="css/theme.default.css" rel="stylesheet">-->
|
<!--<link href="css/theme.default.css" rel="stylesheet">-->
|
||||||
<script src="js/jquery.tablesorter.min.js"></script>
|
<script src="js/jquery.tablesorter.min.js"></script>
|
||||||
<script src="js/jquery.tablesorter.widgets.min.js"></script>
|
<script src="js/jquery.tablesorter.widgets.min.js"></script>
|
||||||
|
<style>#content{ top:5rem; position:relative; }</style>
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,9 @@ msgstr "Alte Sendereihen"
|
|||||||
msgid "button_show_changes"
|
msgid "button_show_changes"
|
||||||
msgstr "Änderungen"
|
msgstr "Änderungen"
|
||||||
|
|
||||||
|
msgid "button_rebuild_episodes"
|
||||||
|
msgstr "Episoden neuzählen"
|
||||||
|
|
||||||
msgid "label_name"
|
msgid "label_name"
|
||||||
msgstr "Name"
|
msgstr "Name"
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,9 @@ msgstr "old series"
|
|||||||
msgid "button_show_changes"
|
msgid "button_show_changes"
|
||||||
msgstr "changes"
|
msgstr "changes"
|
||||||
|
|
||||||
|
msgid "button_rebuild_episodes"
|
||||||
|
msgstr "recount episodes"
|
||||||
|
|
||||||
msgid "label_name"
|
msgid "label_name"
|
||||||
msgstr "name"
|
msgstr "name"
|
||||||
|
|
||||||
|
|||||||
@@ -93,14 +93,20 @@ if ( defined $params->{action} ) {
|
|||||||
my $result = reassign_event( $config, $request );
|
my $result = reassign_event( $config, $request );
|
||||||
return if defined $result;
|
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');
|
# save_scan ($config, $request) if ($params->{action} eq 'save_scan');
|
||||||
}
|
}
|
||||||
|
|
||||||
$config->{access}->{write} = 0;
|
$config->{access}->{write} = 0;
|
||||||
|
|
||||||
#print STDERR "show_series\n";
|
|
||||||
|
|
||||||
if ( defined $params->{series_id} ) {
|
if ( defined $params->{series_id} ) {
|
||||||
print q{<script src="js/edit-series.js" type="text/javascript"></script>} unless params::isJson();
|
print q{<script src="js/edit-series.js" type="text/javascript"></script>} unless params::isJson();
|
||||||
show_series( $config, $request );
|
show_series( $config, $request );
|
||||||
@@ -111,6 +117,7 @@ if ( defined $params->{series_id} ) {
|
|||||||
} unless params::isJson();
|
} unless params::isJson();
|
||||||
list_series( $config, $request );
|
list_series( $config, $request );
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#insert or update a schedule and update all schedule dates
|
#insert or update a schedule and update all schedule dates
|
||||||
@@ -351,7 +358,6 @@ sub save_series {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#print STDERR Dumper($entry);
|
|
||||||
my $series_ids = series::get(
|
my $series_ids = series::get(
|
||||||
$config,
|
$config,
|
||||||
{
|
{
|
||||||
@@ -1224,6 +1230,160 @@ sub show_series {
|
|||||||
template::process( $config, 'print', $params->{template}, $params );
|
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 "<style>
|
||||||
|
tr {cursor:pointer}
|
||||||
|
td {border:1px solid gray}
|
||||||
|
tr.error {background:#f99}
|
||||||
|
tr.warn {background:#ff9}
|
||||||
|
tr.ok {background:#9f9}
|
||||||
|
</style>
|
||||||
|
";
|
||||||
|
|
||||||
|
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{<a class="button" href="$url"><button>apply changes</button></a>};
|
||||||
|
}
|
||||||
|
my @cols=qw(id start series_name title episode old_episode recurrence recurrence_start project_name studio_name);
|
||||||
|
print "<table>\n";
|
||||||
|
print "<tr>" . join ("", map { "<th>".($_ // '-')."</th>" } @cols) . "</tr>\n" ;
|
||||||
|
|
||||||
|
for my $event (@$events){
|
||||||
|
print qq{<tr class="$event->{class}" onclick="window.location.href=\$(this).attr('href');"}
|
||||||
|
. qq{ href="event.cgi?action=edit&project_id=$event->{project_id}&studio_id=$event->{studio_id}&series_id=$series_id&event_id=$event->{id}"\n}
|
||||||
|
. qq{>}
|
||||||
|
. join ("", map { "<td>".($event->{$_}//'-')."</td>" } @cols)
|
||||||
|
. "</tr>\n";
|
||||||
|
}
|
||||||
|
print "</table>\n";
|
||||||
|
}
|
||||||
|
|
||||||
sub check_params {
|
sub check_params {
|
||||||
my $config = shift;
|
my $config = shift;
|
||||||
my $params = shift;
|
my $params = shift;
|
||||||
@@ -1239,16 +1399,14 @@ sub check_params {
|
|||||||
#actions and roles
|
#actions and roles
|
||||||
$checked->{action} = '';
|
$checked->{action} = '';
|
||||||
if ( defined $params->{action} ) {
|
if ( defined $params->{action} ) {
|
||||||
if ( $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)$/
|
/^(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)$/
|
||||||
)
|
;
|
||||||
{
|
|
||||||
$checked->{action} = $params->{action};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#numeric values
|
#numeric values
|
||||||
$checked->{exclude} = 0;
|
$checked->{exclude} = 0;
|
||||||
|
$checked->{action} = $params->{action};
|
||||||
for my $param (
|
for my $param (
|
||||||
'id', 'project_id', 'studio_id', 'default_studio_id',
|
'id', 'project_id', 'studio_id', 'default_studio_id',
|
||||||
'user_id', 'new_series_id', 'series_id', 'schedule_id',
|
'user_id', 'new_series_id', 'series_id', 'schedule_id',
|
||||||
|
|||||||
@@ -56,6 +56,16 @@
|
|||||||
<button type="submit" name="action" value="show_new_event"><TMPL_VAR .loc.button_create_event></button>
|
<button type="submit" name="action" value="show_new_event"><TMPL_VAR .loc.button_create_event></button>
|
||||||
</form>
|
</form>
|
||||||
</TMPL_IF>
|
</TMPL_IF>
|
||||||
|
|
||||||
|
<TMPL_IF .allow.update_event>
|
||||||
|
<form action="series.cgi">
|
||||||
|
<input type="hidden" name="project_id" value="<TMPL_VAR .project_id>">
|
||||||
|
<input type="hidden" name="studio_id" value="<TMPL_VAR .studio_id>">
|
||||||
|
<input type="hidden" name="series_id" value="<TMPL_VAR .series_id>">
|
||||||
|
<button type="submit" name="action" value="rebuild_episodes"><TMPL_VAR .loc.button_rebuild_episodes></button>
|
||||||
|
</form>
|
||||||
|
</TMPL_IF>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="panel-header">
|
<div class="panel-header">
|
||||||
|
|||||||
Reference in New Issue
Block a user