diff --git a/install/migrate.sql b/install/migrate.sql index 65d67e3..753fb33 100644 --- a/install/migrate.sql +++ b/install/migrate.sql @@ -250,3 +250,11 @@ ADD COLUMN `studio_id` INT(10) UNSIGNED NULL AFTER `project_id`; ALTER TABLE `calcms`.`calcms_series` ADD COLUMN `predecessor_id` INT(10) NULL AFTER `has_single_events`; +CREATE TABLE `calcms`.`calcms_user_default_studios` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `user` VARCHAR(50) NOT NULL, + `project_id` INT(11) NOT NULL, + `studio_id` INT(11) NOT NULL, + PRIMARY KEY (`id`), + INDEX `user` (`user` ASC)); + diff --git a/lib/calcms/uac.pm b/lib/calcms/uac.pm index 8246aa5..1626ce7 100644 --- a/lib/calcms/uac.pm +++ b/lib/calcms/uac.pm @@ -13,6 +13,7 @@ use template(); use project(); use studios(); use user_settings(); +use user_default_studios(); use base 'Exporter'; our @EXPORT_OK = qw( @@ -667,8 +668,9 @@ sub get_user_presets($$) { $config->{access}->{write} = 0; my $user_settings = user_settings::get( $config, { user => $user } ); - $project_id = $user_settings->{project_id} || '' if $project_id eq ''; - $studio_id = $user_settings->{studio_id} || '' if $studio_id eq ''; + $project_id = $user_settings->{project_id} // '' if $project_id eq ''; + my $defaults = user_default_studios::get( $config, { user => $user, project_id => $project_id } ); + $studio_id = $defaults->{studio_id} // $user_settings->{studio_id} // '' if $studio_id eq ''; #get my $admin_roles = get_admin_user_roles( $config, { user => $user } ); diff --git a/lib/calcms/user_default_studios.pm b/lib/calcms/user_default_studios.pm new file mode 100644 index 0000000..4c96999 --- /dev/null +++ b/lib/calcms/user_default_studios.pm @@ -0,0 +1,118 @@ +package user_default_studios; + +use strict; +use warnings; +no warnings 'redefine'; + +use Data::Dumper; + +# table: calcms_user_default_studios +# columns: user, project_id, studio_id +#use base 'Exporter'; +#our @EXPORT_OK = qw(get insert update delete get_columns); + +sub debug; + +sub get_columns($) { + my $config = shift; + + my $dbh = db::connect($config); + my $cols = db::get_columns( $dbh, 'calcms_user_default_studios' ); + my $columns = {}; + for my $col (@$cols) { + $columns->{$col} = 1; + } + return $columns; +} + +sub get ($$) { + my $config = shift; + my $condition = shift; + + my @conditions = (); + my @bind_values = (); + + if ( ( defined $condition->{user} ) && ( $condition->{user} ne '' ) ) { + push @conditions, 'user=?'; + push @bind_values, $condition->{user}; + } + if ( ( defined $condition->{project_id} ) && ( $condition->{project_id} ne '' ) ) { + push @conditions, 'project_id=?'; + push @bind_values, $condition->{project_id}; + } + if ( ( defined $condition->{studio_id} ) && ( $condition->{studio_id} ne '' ) ) { + push @conditions, 'studio_id=?'; + push @bind_values, $condition->{studio_id}; + } + + my $conditions = ''; + $conditions = " where " . join( " and ", @conditions ) if scalar(@conditions) > 0; + + my $query = qq{ + select * + from calcms_user_default_studios + $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}; + + my $dbh = db::connect($config); + return db::insert( $dbh, 'calcms_user_default_studios', $entry ); +} + +sub update($$) { + my $config = shift; + my $entry = shift; + + return unless defined $entry->{user}; + + my @keys = sort keys %$entry; + my $values = join( ",", map { $_ . '=?' } @keys ); + my @bind_values = map { $entry->{$_} } @keys; + + push @bind_values, $entry->{user}; + push @bind_values, $entry->{project_id}; + + my $query = qq{ + update calcms_user_default_studios + set $values + where user=? and project_id=? + }; + + 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}; + + my $query = qq{ + delete + from calcms_user_default_studios + where user=? + }; + my $bind_values = [ $entry->{user} ]; + + my $dbh = db::connect($config); + return db::put( $dbh, $query, $bind_values ); +} + +sub error ($) { + my $msg = shift; + print "ERROR: $msg
\n"; +} + +#do not delete last line! +1; diff --git a/website/agenda/planung/user-settings.cgi b/website/agenda/planung/user-settings.cgi index e63ba96..30dbcb0 100755 --- a/website/agenda/planung/user-settings.cgi +++ b/website/agenda/planung/user-settings.cgi @@ -16,6 +16,7 @@ use project(); use studios(); use params(); use user_settings(); +use user_default_studios(); use localization(); my $r = shift; @@ -33,6 +34,7 @@ my $user_presets = uac::get_user_presets( studio_id => $params->{studio_id} } ); +#print STDERR Dumper($user_presets); $params->{default_studio_id} = $user_presets->{studio_id}; $params = uac::setDefaultStudio( $params, $user_presets ); $params = uac::setDefaultProject( $params, $user_presets ); @@ -123,21 +125,41 @@ sub updateDefaultProjectStudio { my $permissions = $request->{permissions}; my $user = $params->{presets}->{user}; - my $settings = { + my $entry = { user => $user, project_id => $params->{project_id}, studio_id => $params->{studio_id}, }; - my $results = user_settings::get( $config, { user => $user } ); - if ( defined $results ) { + $config->{access}->{write} = 1; + if ( + defined user_settings::get( + $config, + { user => $user } + ) + ) { uac::print_info("update project and studio settings"); - $config->{access}->{write} = 1; - user_settings::update( $config, $settings ); + user_settings::update( $config, $entry ); } else { uac::print_info("insert user settings, as missing on updating default project and studio"); update_settings( $config, $request ); } + + if ( + defined user_default_studios::get( + $config, { + user => $user, + project_id => $params->{project_id} + } + ) + ) { + uac::print_info("update user default studio"); + user_default_studios::update( $config, $entry ); + } else { + uac::print_info("insert user default studio"); + user_default_studios::insert( $config, $entry ); + } + $config->{access}->{write} = 0; }