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:
@@ -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 */;
|
||||
|
||||
|
||||
127
lib/calcms/user_selected_events.pm
Normal file
127
lib/calcms/user_selected_events.pm
Normal 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;
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
110
website/agenda/planung/user-selected-event.cgi
Normal file
110
website/agenda/planung/user-selected-event.cgi
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user