copying events: save user selection

On copying events from another studio selection will be saved.
The next time one wants to copy saved presets are preselected.
This simplifies to frequently rebroadcast shows from another project.
This commit is contained in:
Milan
2021-02-01 22:58:23 +01:00
parent 2f35676c24
commit ef84ca07a3
7 changed files with 348 additions and 18 deletions

View File

@@ -1282,4 +1282,25 @@ UNLOCK TABLES;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2020-12-21 13:16:22
DROP TABLE IF EXISTS `calcms_user_selected_events`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `calcms_user_selected_events` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user` varchar(45) NOT NULL,
`project_id` int(10) unsigned DEFAULT NULL,
`studio_id` int(10) unsigned DEFAULT NULL,
`series_id` int(10) unsigned DEFAULT NULL,
`filter_project_studio` int(1) unsigned DEFAULT NULL,
`filter_series` int(1) unsigned DEFAULT NULL,
`selected_project` int(10) unsigned DEFAULT NULL,
`selected_studio` int(10) unsigned DEFAULT NULL,
`selected_series` int(10) unsigned DEFAULT NULL,
`selected_event` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `unique` (`user`,`project_id`,`studio_id`,`series_id`,`filter_project_studio`,`filter_series`),
KEY `user` (`user`,`project_id`,`studio_id`,`series_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

View File

@@ -0,0 +1,127 @@
package user_selected_events;
use strict;
use warnings;
no warnings 'redefine';
use Data::Dumper;
# table: calcms_user_selected_events
# columns: user, project_id, studio_id, series_id, <- selection
# project_studio_filter, series_filter <- optional filter params
# selected_project, selected_studio, selected_series, selected_event <-result
sub debug;
sub get_columns($) {
my $config = shift;
my $dbh = db::connect($config);
return db::get_columns_hash( $dbh, 'calcms_user_selected_events' );
}
sub get ($$) {
my $config = shift;
my $condition = shift;
my @conditions = ();
my @bind_values = ();
return unless defined $condition->{user};
return unless defined $condition->{project_id};
return unless defined $condition->{studio_id};
return unless defined $condition->{series_id};
for my $field ('user', 'project_id', 'studio_id', 'series_id',
'filter_project_studio', 'filter_series'
){
if ( ( defined $condition->{$field} ) && ( $condition->{$field} ne '' ) ) {
push @conditions, $field.'=?';
push @bind_values, $condition->{$field};
}
}
my $conditions = '';
$conditions = " where " . join( " and ", @conditions ) if scalar(@conditions) > 0;
my $query = qq{
select *
from calcms_user_selected_events
$conditions
};
my $dbh = db::connect($config);
my $entries = db::get( $dbh, $query, \@bind_values );
return $entries->[0] || undef;
}
sub insert ($$) {
my $config = shift;
my $entry = shift;
return unless defined $entry->{user};
return unless defined $entry->{project_id};
return unless defined $entry->{studio_id};
return unless defined $entry->{series_id};
return unless defined $entry->{selected_event};
my $dbh = db::connect($config);
print STDERR "insert".Dumper($entry );
return db::insert( $dbh, 'calcms_user_selected_events', $entry );
}
sub update($$) {
my $config = shift;
my $entry = shift;
my $fields = [
'user', 'project_id', 'studio_id', 'series_id',
'filter_project_studio', 'filter_series'
];
for (@$fields){
return unless defined $entry->{$_}
};
my @keys = sort keys %$entry;
my $values = join( ",", map { $_ . '=?' } @keys );
my @bind_values = map { $entry->{$_} } ( @keys, @$fields );
my $conditions = join (' and ', map { $_.'=?' } @$fields );
my $query = qq{
update calcms_user_selected_events
set $values
where $conditions
};
print STDERR "update".Dumper($query ).Dumper(\@bind_values);
my $dbh = db::connect($config);
return db::put( $dbh, $query, \@bind_values );
}
sub delete ($$) {
my $config = shift;
my $entry = shift;
return unless defined $entry->{user};
return unless defined $entry->{project_id};
return unless defined $entry->{studio_id};
return unless defined $entry->{series_id};
my $query = qq{
delete
from calcms_user_selected_events
where user=? and project_id=? and studio_id=? and series_id=?
};
my $bind_values = [ $entry->{user}, $entry->{project_id}, $entry->{studio_id}, $entry->{series_id} ];
my $dbh = db::connect($config);
return db::put( $dbh, $query, $bind_values );
}
sub error ($) {
my $msg = shift;
print "ERROR: $msg<br/>\n";
}
#do not delete last line!
1;

View File

@@ -88,8 +88,33 @@ function updateEventSelection(resultElemId){
// set selected eventId at external result selector
function selectEventAction(resultElemId){
var eventId=$('#selectEvent #eventId').val();
var projectId = $('#selectEvent #projectId').val();
var studioId = $('#selectEvent #studioId').val();
var seriesId = $('#selectEvent #seriesId').val();
var eventId = $('#selectEvent #eventId').val();
if (eventId<=0) return;
var filterProjectStudio = $('#selectEvent #selectProjectStudio').length!=0 ? 1:0;
var filterSeries = $('#selectEvent #selectSeries').length!=0 ? 1:0;
var url = "user-selected-event.cgi";
url += "?project_id=" + getProjectId();
url += "&studio_id=" + getStudioId();
url += "&series_id=" + getUrlParameter("series_id");
url += "&filter_project_studio=" + filterProjectStudio;
url += "&filter_series=" + filterSeries;
url += "&selected_project=" + projectId;
url += "&selected_studio=" + studioId;
url += "&selected_series=" + seriesId;
url += "&selected_event=" + eventId;
$.get(url).done(function() {
console.log("success: "+url)
}).fail(function() {
console.log("failed: "+url)
});
// set the result value
$('#'+resultElemId).val( eventId );
// trigger the change event for invisble form elements

View File

@@ -16,6 +16,7 @@ use uac();
use series();
use localization();
use user_selected_events();
binmode STDOUT, ":utf8";
@@ -70,11 +71,21 @@ sub show_events {
return;
}
my $entry = {
user => $request->{user},
project_id => $params->{p_id},
studio_id => $params->{s_id},
series_id => $params->{series_id},
filter_project_studio => $params->{selectProjectStudio},
filter_series => $params->{selectSeries},
};
my $preset = user_selected_events::get($config, $entry);
# get user projects
my $user_projects = uac::get_projects_by_user( $config, { user => $request->{user} } );
my $projects = {};
my $project_by_id = {};
for my $project (@$user_projects) {
$projects->{ $project->{project_id} } = $project;
$project_by_id->{ $project->{project_id} } = $project;
}
# get user studios
@@ -82,32 +93,64 @@ sub show_events {
for my $studio (@$user_studios) {
my $project_id = $studio->{project_id};
my $studio_id = $studio->{id};
$studio->{project_name} = $projects->{$project_id}->{name};
$studio->{selected} = 1 if ( $project_id eq $params->{p_id} ) && ( $studio_id eq $params->{s_id} );
$studio->{project_name} = $project_by_id->{$project_id}->{name};
if ($preset) {
$studio->{selected} = 1 if $project_id eq $preset->{selected_project} and $studio_id eq $preset->{selected_studio};
} else {
$studio->{selected} = 1 if $project_id eq $params->{p_id} and $studio_id eq $params->{s_id};
}
}
# get series
my $options = {};
$options->{project_id} = $params->{p_id} if defined $params->{p_id};
$options->{studio_id} = $params->{s_id} if defined $params->{s_id};
if ($preset){
$options->{project_id} = $preset->{selected_project};
$options->{studio_id} = $preset->{selected_studio};
}else{
$options->{project_id} = $params->{p_id} if defined $params->{p_id};
$options->{studio_id} = $params->{s_id} if defined $params->{s_id};
}
my $series = series::get( $config, $options );
for my $serie (@$series) {
$serie->{selected} = 1 if ( defined $params->{series_id} ) && ( $serie->{series_id} eq $params->{series_id} );
if ( defined $params->{series_id} ){
if ($preset){
$serie->{selected} = 1 if $serie->{series_id} eq $preset->{selected_series};
} else {
$serie->{selected} = 1 if $serie->{series_id} eq $params->{series_id};
}
}
$serie->{series_name} = 'Einzelsendung' if $serie->{series_name} eq '_single_';
}
# get events
$options->{series_id} = $params->{series_id} if defined $params->{series_id};
if ($preset){
$options->{series_id} = $preset->{selected_series};
}else{
$options->{series_id} = $params->{series_id} if defined $params->{series_id};
}
$options->{from_date} = $params->{from_date} if defined $params->{from_date};
$options->{till_date} = $params->{till_date} if defined $params->{till_date};
$options->{set_no_listen_keys} = 1;
my $events = series::get_events( $config, $options );
my $preset_year = '';
for my $event ( @$events ) {
if ($preset and $preset->{selected_event} eq $event->{id}){
$event->{selected} = 1;
$preset_year = (split /\-/, $event->{start_date})[0];
}
}
# filter by year
my $years = [];
for my $year ( 2005 .. 2025 ) {
my $date = { year => $year };
$date->{selected} = 1 if ( defined $params->{from_date} ) && ( $params->{from_date} eq $year . '-01-01' );
if ( $preset ){
$date->{selected} = 1 if $preset_year eq $year;
}else{
$date->{selected} = 1 if ( defined $params->{from_date} ) && ( $params->{from_date} eq $year . '-01-01' );
}
push @$years, $date;
}

View File

@@ -15,7 +15,9 @@
if (series_id=='')return false;
$('#assignments_form input[name="series_id"]').val(series_id);
var url="assign-series.cgi?project_id="+project_id+'&studio_id='+studio_id+'&series_id='+series_id+'&action=assign_series';
$('#assignments_form input[name="action"]').val("assign_series");
//var url="assign-series.cgi?project_id="+project_id+'&studio_id='+studio_id+'&series_id='+series_id+'&action=assign_series';
//console.log("url:"+url);
$('#assignments_form').submit();
return false;
}
@@ -24,9 +26,12 @@
if (project_id=='')return false;
if (studio_id=='')return false;
if (series_id=='')return false;
$('#assignments_form input[name="series_id"]').val(series_id);
var url="assign-series.cgi?project_id="+project_id+'&studio_id='+studio_id+'&series_id='+series_id+'&action=unassign_series';
$('#assignments_form input[name="action"]').val("unassign_series");
alert("unassign");
//var url="assign-series.cgi?project_id="+project_id+'&studio_id='+studio_id+'&series_id='+series_id+'&action=unassign_series';
//console.log("url:"+url);
$('#assignments_form').submit();
return false;
}
@@ -39,7 +44,7 @@
}
</style>
assign series to project <b><TMPL_VAR project_name></b> and studio <b><TMPL_VAR studio_name></b>
assign and unassign series to project <b><TMPL_VAR project_name></b> and studio <b><TMPL_VAR studio_name></b>
<!-- view series -->
<div id="view_<TMPL_VAR .series_id>" class="view" style="clear:both">
@@ -49,7 +54,7 @@
<select style="float:left;max-width:600px;" id="series_id">
<option value="">--select--</option>
<TMPL_LOOP series>
<option value="<TMPL_VAR series_id>"><b><TMPL_VAR series_name> - <TMPL_VAR title></b> [<TMPL_VAR project_name> - <TMPL_VAR studio_name>]
<option value="<TMPL_VAR series_id>"><b><TMPL_VAR series_name> - <TMPL_VAR title></b> [<TMPL_VAR project_name> - <TMPL_VAR studio_name> - <TMPL_VAR series_id>]
</TMPL_LOOP>
</select>
@@ -57,7 +62,6 @@
<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>">
<input type="hidden" name="action" value="assign_series">
<button target="_blank"
onclick="assign_series('<TMPL_VAR .project_id>', '<TMPL_VAR .studio_id>', $('#series_id').val());return false;"
style="float:left"

View File

@@ -59,7 +59,7 @@
<td>
<select id="eventId" onchange=selectEventAction('<TMPL_VAR resultElemId>')>
<option value="-1"><TMPL_VAR .loc.label_select></option>
<TMPL_LOOP events><option value="<TMPL_VAR id>"><TMPL_VAR start> - <TMPL_VAR full_title></option>
<TMPL_LOOP events><option value="<TMPL_VAR id>" <TMPL_IF selected>selected="selected"</TMPL_IF>><TMPL_VAR start> - <TMPL_VAR full_title></option>
</TMPL_LOOPS>
</select>
</td>

View File

@@ -0,0 +1,110 @@
#!/usr/bin/perl
use strict;
use warnings;
no warnings 'redefine';
use Data::Dumper;
use params();
use config();
use entry();
use log();
use template();
use auth();
use uac();
use series();
use localization();
use user_selected_events();
binmode STDOUT, ":utf8";
my $r = shift;
( my $cgi, my $params, my $error ) = params::get($r);
my $config = config::get('../config/config.cgi');
my $debug = $config->{system}->{debug};
my ( $user, $expires ) = auth::get_user( $config, $params, $cgi );
return if ( ( !defined $user ) || ( $user eq '' ) );
my $user_presets = uac::get_user_presets(
$config,
{
project_id => $params->{project_id},
studio_id => $params->{studio_id},
user => $user
}
);
$params->{default_studio_id} = $user_presets->{studio_id};
$params = uac::setDefaultStudio( $params, $user_presets );
$params = uac::setDefaultProject( $params, $user_presets );
my $request = {
url => $ENV{QUERY_STRING} || '',
params => {
original => $params,
checked => check_params( $config, $params ),
},
};
$request = uac::prepare_request( $request, $user_presets );
print "Content-type:text/plain; charset=UTF-8;\n\n";
return unless uac::check( $config, $params, {} ) == 1;
log_event_selection( $config, $request, $user );
sub get_select_fields {
return [
'project_id', 'studio_id',
'series_id', 'filter_project_studio', 'filter_series'
];
}
sub get_value_fields {
return [
'selected_project', 'selected_studio',
'selected_series', 'selected_event'
];
}
sub log_event_selection {
my $config = shift;
my $request = shift;
my $user = shift;
my $params = $request->{params}->{checked};
my $permissions = $request->{permissions};
unless ( $permissions->{read_event} == 1 ) {
uac::permissions_denied('read_event');
return;
}
my $select_fields = get_select_fields();
my $value_fields = get_value_fields();
my $entry = { user => $user };
$entry->{$_} = $params->{$_} for @$select_fields;
my $preset = user_selected_events::get( $config, $entry );
$entry->{$_} = $params->{$_} for ( @$select_fields, @$value_fields);
for ( @$select_fields, @$value_fields ) {
uac::print_error("missing $_") unless defined $entry->{$_};
}
if ($preset) {
print "update\n";
user_selected_events::update( $config, $entry );
} else {
print "insert\n";
user_selected_events::insert( $config, $entry );
}
}
sub check_params {
my $config = shift;
my $params = shift;
my @fields = ( @{get_select_fields()}, @{get_value_fields()} );
my $checked = {};
entry::set_numbers( $checked, $params, \@fields );
return $checked;
}