From 979377c31dc1d95b6a25a98fe2361f22b2afe774 Mon Sep 17 00:00:00 2001 From: Milan Date: Mon, 20 Mar 2023 23:09:11 +0100 Subject: [PATCH 1/7] help-texts: add users with permission edit_help_texts are allowed to select edit help texts from menu and enter texts for all event fields. Other users will see help texts as tooltips. This allows to provide help to users depending on your workflow. help texts are saved by project and studio. --- install/create.sql | 13 +- install/migrate.sql | 12 + lib/calcms/help_texts.pm | 105 ++++++++ .../agenda/planung/css/edit-help-texts.css | 3 + website/agenda/planung/help-texts.cgi | 237 ++++++++++++++++++ website/agenda/planung/js/edit-event.js | 17 +- .../agenda/planung/pot/de/edit-help-texts.po | 0 website/agenda/planung/pot/de/help-texts.po | 12 + website/agenda/planung/pot/de/menu.po | 4 + website/agenda/planung/pot/de/roles.po | 3 + .../agenda/planung/pot/en/edit-help-texts.po | 0 website/agenda/planung/pot/en/help-texts.po | 12 + website/agenda/planung/pot/en/menu.po | 3 + website/agenda/planung/pot/en/roles.po | 3 + website/agenda/planung/templates/default.html | 4 + .../planung/templates/edit-help-texts.html | 21 ++ 16 files changed, 447 insertions(+), 2 deletions(-) create mode 100644 lib/calcms/help_texts.pm create mode 100644 website/agenda/planung/css/edit-help-texts.css create mode 100644 website/agenda/planung/help-texts.cgi create mode 100644 website/agenda/planung/pot/de/edit-help-texts.po create mode 100644 website/agenda/planung/pot/de/help-texts.po create mode 100644 website/agenda/planung/pot/en/edit-help-texts.po create mode 100644 website/agenda/planung/pot/en/help-texts.po create mode 100644 website/agenda/planung/templates/edit-help-texts.html diff --git a/install/create.sql b/install/create.sql index 801ceff..4224b2a 100644 --- a/install/create.sql +++ b/install/create.sql @@ -620,6 +620,7 @@ CREATE TABLE `calcms_roles` ( `delete_audio_recordings` tinyint unsigned NOT NULL, `read_playout` tinyint unsigned NOT NULL, `create_download` tinyint unsigned NOT NULL, + `edit_help_texts` INT(1) UNSIGNED NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `role_2` (`role`), KEY `project_id` (`project_id`), @@ -1767,4 +1768,14 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2023-02-19 23:01:42 \ No newline at end of file +-- Dump completed on 2023-02-19 23:01:42 + +CREATE TABLE `calcms_help_texts` ( + `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `project_id` INT UNSIGNED NOT NULL, + `studio_id` INT UNSIGNED NOT NULL, + `lang` VARCHAR(5) NOT NULL, + `table` VARCHAR(45) NOT NULL, + `column` VARCHAR(45) NOT NULL, + `text` TEXT(500) NOT NULL, + PRIMARY KEY (`id`)); diff --git a/install/migrate.sql b/install/migrate.sql index 9e2b52e..09248c5 100644 --- a/install/migrate.sql +++ b/install/migrate.sql @@ -289,3 +289,15 @@ DROP INDEX `category` ; ; ALTER TABLE calcms_user_series DROP COLUMN active; + +CREATE TABLE `calcms_help_texts` ( + `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `project_id` INT UNSIGNED NOT NULL, + `studio_id` INT UNSIGNED NOT NULL, + `lang` VARCHAR(5) NOT NULL, + `table` VARCHAR(45) NOT NULL, + `column` VARCHAR(45) NOT NULL, + `text` TEXT(500) NOT NULL, + PRIMARY KEY (`id`)); + +ALTER TABLE `calcms_roles` ADD COLUMN `edit_help_texts` INT(1) UNSIGNED NOT NULL; diff --git a/lib/calcms/help_texts.pm b/lib/calcms/help_texts.pm new file mode 100644 index 0000000..f9f037c --- /dev/null +++ b/lib/calcms/help_texts.pm @@ -0,0 +1,105 @@ +package help_texts; + +use strict; +use warnings; +no warnings 'redefine'; + +use Data::Dumper; + +# table: calcms_help_texts +# columns: id, studio_id, series_id, +# table, column, text + +#use base 'Exporter'; +our @EXPORT_OK = qw(get_columns get insert update delete); + +sub get_columns($) { + my ($config) = @_; + my $dbh = db::connect($config); + return db::get_columns_hash( $dbh, 'calcms_help_texts' ); +} + +#map schedule id to id +sub get($$) { + my ($config, $condition) = @_; + + my $dbh = db::connect($config); + + my @conditions = (); + my @bind_values = (); + for my $col ('project_id', 'studio_id', 'lang', 'table', 'column', 'text') { + if ( ( defined $condition->{$col} ) && ( $condition->{$col} ne '' ) ) { + push @conditions, "`calcms_help_texts`.`$col`=?"; + push @bind_values, $condition->{$col}; + } + } + my $conditions = ''; + $conditions = " where " . join( " and ", @conditions ) if ( @conditions > 0 ); + my $query = qq{ + select * + from calcms_help_texts + $conditions + }; + my $entries = db::get( $dbh, $query, \@bind_values ); + return $entries; +} + +sub insert ($$) { + my ($config, $entry) = @_; + + for my $col ('project_id', 'studio_id', 'lang', 'table', 'column', 'text') { + return undef unless defined $entry->{$col}; + } + my $dbh = db::connect($config); + + return db::insert( $dbh, 'calcms_help_texts', $entry ); +} + +sub update ($$) { + my ($config, $entry) = @_; + + for my $col ('project_id', 'studio_id', 'lang', 'table', 'column', 'text') { + return undef unless defined $entry->{$col}; + } + my $dbh = db::connect($config); + my @keys = sort keys %$entry; + my $values = join( ",", map { "`$_`" . '=?' } @keys); + my @bind_values = map { $entry->{$_} } @keys; + for my $col ('project_id', 'studio_id', 'lang', 'table', 'column') { + push @bind_values, $entry->{$col}; + } + my $query = qq{ + update calcms_help_texts + set $values + where + `calcms_help_texts`.`project_id`=? + and `calcms_help_texts`.`studio_id`=? + and `calcms_help_texts`.`lang`=? + and `calcms_help_texts`.`table`=? + and `calcms_help_texts`.`column`=? + }; + return db::put( $dbh, $query, \@bind_values ); + print "done\n"; +} + +sub delete($$) { + my ($config, $entry) = @_; + + for my $col ('project_id', 'studio_id', 'lang', 'table', 'column', 'text') { + return undef unless defined $entry->{$col}; + } + my $dbh = db::connect($config); + my $query = qq{ + delete + from calcms_help_texts + where project_id=? and studio_id=? and lang=? and `calcms_help_texts`.`table`=? and `calcms_help_texts`.`column`=? + }; + my $bind_values = []; + for my $col ('project_id', 'studio_id', 'lang', 'table', 'column') { + push @$bind_values, $entry->{$col}; + } + return db::put( $dbh, $query, $bind_values ); +} + +#do not delete last line! +1; diff --git a/website/agenda/planung/css/edit-help-texts.css b/website/agenda/planung/css/edit-help-texts.css new file mode 100644 index 0000000..579f1d2 --- /dev/null +++ b/website/agenda/planung/css/edit-help-texts.css @@ -0,0 +1,3 @@ +textarea{ + width:100px; +} \ No newline at end of file diff --git a/website/agenda/planung/help-texts.cgi b/website/agenda/planung/help-texts.cgi new file mode 100644 index 0000000..b1c19aa --- /dev/null +++ b/website/agenda/planung/help-texts.cgi @@ -0,0 +1,237 @@ +#!/usr/bin/perl + +use strict; +use warnings; +no warnings 'redefine'; + +use Data::Dumper; +use URI::Escape(); +use params(); +use config(); +use entry(); +use template(); +use auth(); +use uac(); +use help_texts(); +use localization(); +use JSON; +binmode STDOUT, ":utf8"; + +my $r = shift; +( my $cgi, my $params, my $error ) = params::get($r); + +my $config = config::get('../config/config.cgi'); +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 ); +$params = $request->{params}->{checked}; +return get_help( $config, $request ) if $params->{action} eq 'get'; + +#process header +my $headerParams = uac::set_template_permissions( $request->{permissions}, $params ); +$headerParams->{loc} = localization::get( $config, { user => $user, file => 'menu' } ); +template::process( $config, 'print', template::check( $config, 'default.html' ), $headerParams ); +return unless uac::check( $config, $params, $user_presets ) == 1; + +if ( defined $params->{action} ) { + save_help( $config, $request ) if $params->{action} eq 'save'; + delete_help( $config, $request ) if $params->{action} eq 'delete'; +} +edit_help( $config, $request ); + +$config->{access}->{write} = 0; + +return; + +sub save_help { + my ($config, $request) = @_; + + my $params = $request->{params}->{checked}; + my $permissions = $request->{permissions}; + unless ( $permissions->{edit_help_texts} == 1 ) { + uac::permissions_denied('edit_help_texts'); + return; + } + + for my $attr ( 'project_id', 'studio_id', 'table', 'column', 'text' ) { + unless ( defined $params->{$attr} ) { + uac::print_error( $attr . ' not given!' ); + return; + } + } + + my $entry = {}; + for my $attr ('project_id', 'studio_id', 'table', 'column', 'text') { + $entry->{$attr} = $params->{$attr} if defined $params->{$attr}; + } + my $user_settings = user_settings::get( $config, { user => $user } ); + $entry->{lang} = $user_settings->{language} || 'en', + my $results = help_texts::get($config, { + project_id => $entry->{project_id}, + studio_id => $entry->{studio_id}, + lang => $entry->{lang}, + table => $entry->{table}, + column => $entry->{column}, + }); + $config->{access}->{write} = 1; + if ( @$results ) { + help_texts::update( $config, $entry ); + uac::print_info("help text saved."); + } else { + my $schedule_id = help_texts::insert( $config, $entry ); + uac::print_info("help text added."); + } + $config->{access}->{write} = 0; +} + +sub delete_help { + my ($config, $request) = @_; + my $params = $request->{params}->{checked}; + my $permissions = $request->{permissions}; + unless ( $permissions->{edit_help_texts} == 1 ) { + uac::permissions_denied('edit_help_texts'); + return; + } + + for my $attr ( 'project_id', 'studio_id', 'table', 'column', 'text' ) { + unless ( defined $params->{$attr} ) { + uac::print_error( $attr . ' not given!' ); + return; + } + } + + my $entry = {}; + for my $attr ('project_id', 'studio_id', 'table', 'column') { + $entry->{$attr} = $params->{$attr} if defined $params->{$attr}; + } + my $user_settings = user_settings::get( $config, { user => $user } ); + $entry->{lang} = $user_settings->{language} || 'en', + + $config->{access}->{write} = 1; + help_texts::delete( $config, $entry ); + uac::print_info("help-text deleted"); +} + +sub edit_help { + my ($config, $request) = @_; + + $config->{access}->{write} = 0; + my $params = $request->{params}->{checked}; + my $permissions = $request->{permissions}; + unless ( $permissions->{edit_help_texts} == 1 ) { + uac::permissions_denied('edit_help_texts'); + return; + } + + for my $param ( 'project_id', 'studio_id' ) { + unless ( defined $params->{$param} ) { + uac::print_error("missing $param"); + return; + } + } + + my $table = "calcms_events"; + my $help_texts = help_texts::get( + $config, + { + project_id => $params->{project_id}, + studio_id => $params->{studio_id}, + table => $table + } + ); + my %texts_by_column = map { $_->{column} => $_->{text}} @$help_texts; + my $texts_by_column = \%texts_by_column; + + $params->{tables} = [{ + name => $table, + columns => [ + {table => $table, column => 'title', value => ($texts_by_column->{title} // '') }, + {table => $table, column => 'user_title', value => ($texts_by_column->{user_title} // '') }, + {table => $table, column => 'episode', value => ($texts_by_column->{episode} // '') }, + {table => $table, column => 'start_date', value => ($texts_by_column->{start_date} // '') }, + {table => $table, column => 'end_date', value => ($texts_by_column->{end_date} // '') }, + {table => $table, column => 'duration', value => ($texts_by_column->{duration} // '') }, + {table => $table, column => 'live', value => ($texts_by_column->{live} // '') }, + {table => $table, column => 'published', value => ($texts_by_column->{published} // '') }, + {table => $table, column => 'playout', value => ($texts_by_column->{playout} // '') }, + {table => $table, column => 'archive', value => ($texts_by_column->{archive} // '') }, + {table => $table, column => 'rerun', value => ($texts_by_column->{rerun} // '') }, + {table => $table, column => 'draw', value => ($texts_by_column->{draw} // '') }, + {table => $table, column => 'excerpt', value => ($texts_by_column->{excerpt} // '') }, + {table => $table, column => 'topic', value => ($texts_by_column->{topic} // '') }, + {table => $table, column => 'content', value => ($texts_by_column->{content} // '') }, + {table => $table, column => 'image', value => ($texts_by_column->{image} // '') }, + {table => $table, column => 'podcast_url', value => ($texts_by_column->{podcast_url} // '') }, + {table => $table, column => 'archive_url', value => ($texts_by_column->{archive_url} // '') }, + {table => $table, column => 'wiki_language', value => ($texts_by_column->{wiki_language} // '') }, + ] + }]; + + $params->{loc} = localization::get( $config, { user => $params->{presets}->{user}, file => 'edit-help-texts' } ); + template::process( $config, 'print', $params->{template}, $params ); +} + +sub get_help{ + my ($config, $request) = @_; + for my $param ( 'project_id', 'studio_id' ) { + unless ( defined $params->{$param} ) { + uac::print_error("missing $param"); + return; + } + } + + my $table = "calcms_events"; + my $help_texts = help_texts::get( + $config, + { + project_id => $params->{project_id}, + studio_id => $params->{studio_id}, + table => $table + } + ); + my %texts_by_column = map { $_->{column} => $_->{text}} @$help_texts; + my $texts_by_column = \%texts_by_column; + print "Content-type:application/json\n\n".JSON::encode_json($texts_by_column); +} + +sub check_params { + my ($config, $params) = @_; + + my $checked = {}; + + $checked->{action} = entry::element_of( $params->{action}, + ['get', 'edit', 'save', 'delete'] + ); + + entry::set_numbers( $checked, $params, ['project_id', 'studio_id']); + entry::set_strings( $checked, $params, ['table', 'column', 'text']); + + if ( defined $checked->{studio_id} ) { + $checked->{default_studio_id} = $checked->{studio_id}; + } else { + $checked->{studio_id} = -1; + } + + $checked->{template} = template::check( $config, $params->{template}, 'edit-help-texts' ); + return $checked; +} diff --git a/website/agenda/planung/js/edit-event.js b/website/agenda/planung/js/edit-event.js index 96390eb..d642195 100644 --- a/website/agenda/planung/js/edit-event.js +++ b/website/agenda/planung/js/edit-event.js @@ -333,7 +333,22 @@ $(document).ready( updateCheckBox("#edit_event input[name='published']", 0); } } - ) + ) + + jQuery.getJSON("help-texts.cgi?project_id="+getProjectId()+"&studio_id="+getStudioId()+"&action=get", + function(data){ + for (col in data){ + let value = data[col]; + console.log(col+" "+value) + $(`input[name="${col}"]`).hover(function() { + $(this).attr("title",value) + }); + $(`textarea[class="${col}"]`).hover(function() { + $(this).attr("title",value) + }); + } + }); + console.log("done") } ); diff --git a/website/agenda/planung/pot/de/edit-help-texts.po b/website/agenda/planung/pot/de/edit-help-texts.po new file mode 100644 index 0000000..e69de29 diff --git a/website/agenda/planung/pot/de/help-texts.po b/website/agenda/planung/pot/de/help-texts.po new file mode 100644 index 0000000..40ac1b3 --- /dev/null +++ b/website/agenda/planung/pot/de/help-texts.po @@ -0,0 +1,12 @@ +msgid "save_button" +msgstr "speichern" + +msgid "delete_button" +msgstr "löschen" + +msgid "table" +msgstr "Tabelle" + +msgid "column" +msgstr "spalte" + diff --git a/website/agenda/planung/pot/de/menu.po b/website/agenda/planung/pot/de/menu.po index 38c6dd5..6ab82df 100644 --- a/website/agenda/planung/pot/de/menu.po +++ b/website/agenda/planung/pot/de/menu.po @@ -64,3 +64,7 @@ msgstr "Nutzeraktivität" msgid "create-events" msgstr "Sendungen anlegen" +msgid "edit-help-texts" +msgstr "Hilfe bearbeiten" + + diff --git a/website/agenda/planung/pot/de/roles.po b/website/agenda/planung/pot/de/roles.po index ac53ee6..a909646 100644 --- a/website/agenda/planung/pot/de/roles.po +++ b/website/agenda/planung/pot/de/roles.po @@ -253,3 +253,6 @@ msgstr "Vorproduktion löschen" msgid "label_read_playout" msgstr "Playout anzeigen" +msgid "label_edit_help_texts" +msgstr "Hilfetexte bearbeiten" + diff --git a/website/agenda/planung/pot/en/edit-help-texts.po b/website/agenda/planung/pot/en/edit-help-texts.po new file mode 100644 index 0000000..e69de29 diff --git a/website/agenda/planung/pot/en/help-texts.po b/website/agenda/planung/pot/en/help-texts.po new file mode 100644 index 0000000..443b8b2 --- /dev/null +++ b/website/agenda/planung/pot/en/help-texts.po @@ -0,0 +1,12 @@ +msgid "save_button" +msgstr "save" + +msgid "delete_button" +msgstr "delete" + +msgid "table" +msgstr "Table" + +msgid "column" +msgstr "Column" + diff --git a/website/agenda/planung/pot/en/menu.po b/website/agenda/planung/pot/en/menu.po index b1543fd..b784fb9 100644 --- a/website/agenda/planung/pot/en/menu.po +++ b/website/agenda/planung/pot/en/menu.po @@ -64,3 +64,6 @@ msgstr "User Stats" msgid "create-events" msgstr "Create Events" +msgid "edit-help-texts" +msgstr "Edit Help" + diff --git a/website/agenda/planung/pot/en/roles.po b/website/agenda/planung/pot/en/roles.po index 8379cf5..2634c11 100644 --- a/website/agenda/planung/pot/en/roles.po +++ b/website/agenda/planung/pot/en/roles.po @@ -256,3 +256,6 @@ msgstr "delete audio recordings" msgid "label_read_playout" msgstr "show playout" +msgid "label_edit_help_texts" +msgstr "edit help texts" + diff --git a/website/agenda/planung/templates/default.html b/website/agenda/planung/templates/default.html index 6ef9eb5..2ea6113 100644 --- a/website/agenda/planung/templates/default.html +++ b/website/agenda/planung/templates/default.html @@ -57,6 +57,10 @@
 
+ +
 
+
+
 
 
diff --git a/website/agenda/planung/templates/edit-help-texts.html b/website/agenda/planung/templates/edit-help-texts.html new file mode 100644 index 0000000..ddee096 --- /dev/null +++ b/website/agenda/planung/templates/edit-help-texts.html @@ -0,0 +1,21 @@ + + + + +Table + + + + + + + + + + + + + + +
+
\ No newline at end of file From 907b5e9576570e871d120988b406b1b6d83a79ff Mon Sep 17 00:00:00 2001 From: Milan Date: Tue, 21 Mar 2023 21:48:05 +0100 Subject: [PATCH 2/7] Configure event notification sender email address This commit adds the ability to configure the email address used as sender, CC, and reply-to in event notification emails via the configuration entry." --- website/agenda/config/config.cgi.off | 1 + website/agenda/planung/notify-events.cgi | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/website/agenda/config/config.cgi.off b/website/agenda/config/config.cgi.off index c8074ca..4fe18d4 100755 --- a/website/agenda/config/config.cgi.off +++ b/website/agenda/config/config.cgi.off @@ -72,6 +72,7 @@ domain ${DOMAIN} # multi language support admin_pot_dir ${BASE_DIR}/agenda/planung/pot/ email info@${DOMAIN} + event_sender_email programm@${DOMAIN} theme default diff --git a/website/agenda/planung/notify-events.cgi b/website/agenda/planung/notify-events.cgi index 5741281..ff6366a 100755 --- a/website/agenda/planung/notify-events.cgi +++ b/website/agenda/planung/notify-events.cgi @@ -202,12 +202,12 @@ sub getMail { $event->{noRecipient} = 1; return; } - + my $sender = $config->{location}->{event_sender_email}; my $mail = { - 'From' => 'programm@radiopiloten.de', + 'From' => $sender, 'To' => join( ', ', @$userMails ), - 'Cc' => 'programm@radiopiloten.de', - 'Reply-To' => 'programm@radiopiloten.de', + 'Cc' => $sender, + 'Reply-To' => $sender, 'Subject' => "$event->{start} - $event->{full_title}", 'Data' => "Hallo " . join( ' und ', @$userNames ) . ",\n\n" }; From 4366922d76ff3deec080803bdf291d751f38124f Mon Sep 17 00:00:00 2001 From: Milan Date: Tue, 21 Mar 2023 21:56:33 +0100 Subject: [PATCH 3/7] fixup! category: remove --- install/migrate.sql | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/install/migrate.sql b/install/migrate.sql index 09248c5..e5212df 100644 --- a/install/migrate.sql +++ b/install/migrate.sql @@ -274,19 +274,18 @@ ADD COLUMN `listen_key` VARCHAR(100) NULL; ALTER TABLE `calcms_audio_recordings` ADD COLUMN `active` TINYINT(1) NOT NULL DEFAULT 0 AFTER `event_id`; -ALTER TABLE `calcms`.`calcms_audio_recordings` +ALTER TABLE `calcms_audio_recordings` ADD INDEX `active_index` (`active`); -ALTER TABLE `calcms`.`calcms_events` +ALTER TABLE `calcms_events` DROP COLUMN `category_count`, DROP COLUMN `category`, DROP INDEX `category` ; -; -ALTER TABLE `calcms`.`calcms_event_history` + +ALTER TABLE `calcms_event_history` DROP COLUMN `category_count`, DROP COLUMN `category`, DROP INDEX `category` ; -; ALTER TABLE calcms_user_series DROP COLUMN active; From a93a09e5545c0684d78eba638215c594b035be23 Mon Sep 17 00:00:00 2001 From: Milan Date: Tue, 21 Mar 2023 22:22:03 +0100 Subject: [PATCH 4/7] Remove past recordings This commit adds a tool that removes all recordings that have been played out in the past. The tool scans the database for recordings that have a play time in the past and removes them from the system to free up storage space and prevent outdated recordings from being played again. This helps to ensure that only current and relevant recordings are available for playback. --- tools/remove-recordings.pl | 42 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 tools/remove-recordings.pl diff --git a/tools/remove-recordings.pl b/tools/remove-recordings.pl new file mode 100644 index 0000000..f6c58eb --- /dev/null +++ b/tools/remove-recordings.pl @@ -0,0 +1,42 @@ +#! /usr/bin/perl + +use warnings; +use strict; +use Data::Dumper; +use List::Util qw(); + +use FindBin qw($Bin); +use lib "$Bin/../lib/calcms"; +use config; +use time; +use db; +use File::Basename qw(basename); +my $config = config::get(pop @ARGV); +my $delete = grep {$_ eq "--delete"} @ARGV; + +my $dbh = db::connect($config); +my $query = qq{ + select start, path + from calcms_events e, calcms_audio_recordings r + where e.id = r.event_id + and e.start > date_add(now(), INTERVAL -14 DAY) +}; +my $entries = db::get($dbh, $query); +my %paths = map {normalize($_->{path}) => $_->{start}} @$entries; + +my $dir = $config->{locations}->{local_audio_recordings_dir}; +for my $file (sort glob("$dir/*m4a")) { + next if -M $file < 14; + my $filename = normalize($file); + unless (exists $paths{$filename}) { + print " --- $filename\n"; + unlink $file or die $! if $delete; + } +} + +sub normalize { + my $s = shift; + $s = basename $s; + $s =~ s/\.master(\.\w+)$/$1/; + return $s; +} From 92554ebe956a468f39c421a9defb7bbb7c901df0 Mon Sep 17 00:00:00 2001 From: Milan Date: Tue, 21 Mar 2023 23:04:40 +0100 Subject: [PATCH 5/7] remove deprecated role model --- lib/calcms/roles.pm | 162 -------------------- lib/calcms/template.pm | 38 ----- website/agenda/planung/assign-series.cgi | 1 - website/agenda/planung/assignments.cgi | 1 - website/agenda/planung/calendar.cgi | 1 - website/agenda/planung/event.cgi | 1 - website/agenda/planung/help.cgi | 1 - website/agenda/planung/playout.cgi | 1 - website/agenda/planung/projects.cgi | 2 - website/agenda/planung/roles.cgi | 1 - website/agenda/planung/series.cgi | 1 - website/agenda/planung/studio-timeslots.cgi | 1 - website/agenda/planung/studios.cgi | 2 - website/agenda/planung/user-settings.cgi | 1 - website/agenda/planung/user-stats.cgi | 1 - website/agenda/planung/users.cgi | 1 - website/agenda/planung/work-time.cgi | 1 - 17 files changed, 217 deletions(-) delete mode 100644 lib/calcms/roles.pm diff --git a/lib/calcms/roles.pm b/lib/calcms/roles.pm deleted file mode 100644 index eb3f1a6..0000000 --- a/lib/calcms/roles.pm +++ /dev/null @@ -1,162 +0,0 @@ -package roles; - -use strict; -use warnings; -no warnings 'redefine'; - -use Apache2::Reload(); - -use config(); - -#use base 'Exporter'; -my @EXPORT_OK = qw(get_user get_user_permissions get_template_parameters get_jobs); - -my $ROLES = { - 'admin' => { - access_events => 1, - access_images => 1, - access_comments => 1, - access_sync => 1, - access_system => 1, - read_event_all => 1, - create_event => 1, - delete_event => 1, - update_comment => 1, - create_image => 1, - read_image_own => 1, - read_image_all => 1, - update_image_own => 1, - update_image_all => 1, - delete_image_own => 1, - delete_image_all => 1, - sync_own => 1, - sync_all => 1, - sync_select_range => 1, - upload_playlist => 1, - }, - 'dev' => { - access_events => 1, - access_images => 1, - access_comments => 1, - access_sync => 1, - access_system => 0, - read_event_all => 1, - create_event => 1, - delete_event => 1, - update_comment => 1, - create_image => 1, - read_image_own => 1, - read_image_all => 1, - update_image_own => 1, - update_image_all => 1, - delete_image_own => 1, - delete_image_all => 1, - sync_own => 0, - sync_all => 1, - sync_select_range => 1, - upload_playlist => 1, - }, - 'editor' => { - access_events => 1, - access_images => 1, - access_comments => 1, - access_sync => 1, - access_system => 0, - read_event_all => 0, - create_event => 1, - delete_event => 0, - update_comment => 0, - create_image => 1, - read_image_own => 1, - read_image_all => 1, - update_image_own => 1, - update_image_all => 0, - delete_image_own => 1, - delete_image_all => 0, - sync_own => 1, - sync_all => 0, - sync_select_range => 0, - upload_playlist => 1, - }, - 'nobody' => { - access_events => 0, - access_images => 0, - access_comments => 0, - access_sync => 0, - access_system => 0, - read_event_all => 0, - create_event => 0, - delete_event => 0, - update_comment => 0, - create_image => 0, - read_image_own => 0, - read_image_all => 0, - update_image_own => 0, - update_image_all => 0, - delete_image_own => 0, - delete_image_all => 0, - sync_own => 0, - sync_all => 0, - sync_select_range => 0, - upload_playlist => 0, - } -}; - -sub get_user($) { - my $config = shift; - - my $user = $ENV{REMOTE_USER}; - my $users = $config->{users}; - return $user if defined $users->{$user}; - return 'nobody'; -} - -sub get_user_permissions($) { - my $config = shift; - - my $user = $ENV{REMOTE_USER} || ''; - my $roles = $roles::ROLES; - return $roles->{nobody} unless $user =~ /\S/; - my $users = $config->{users}; - if ( defined $users->{$user} ) { - my $role = $users->{$user}; - return $roles->{$role} if defined $roles->{$role}; - } - return $roles->{nobody}; -} - -sub get_user_jobs ($;$) { - my $config = shift; - - my $user = $ENV{REMOTE_USER} || ''; - return [] unless ( $user =~ /\S/ ); - my $result = []; - my $jobs = $config->{jobs}->{job}; - - for my $job (@$jobs) { - for my $job_user ( split /\,/, $job->{users} ) { - push @$result, $job if ( $user eq $job_user ); - } - } - return $result; -} - -sub get_jobs($) { - my $config = shift; - - return $config->{jobs}->{job}; -} - -sub get_template_parameters($$) { - my $config = shift; - my $user_permissions = shift; - - $user_permissions = roles::get_user_permissions($config) unless defined $user_permissions; - my @user_permissions = (); - for my $usecase ( keys %$user_permissions ) { - push @user_permissions, $usecase if $user_permissions->{$usecase} eq '1'; - } - return \@user_permissions; -} - -return 1; diff --git a/lib/calcms/template.pm b/lib/calcms/template.pm index 74e797e..8b3f668 100644 --- a/lib/calcms/template.pm +++ b/lib/calcms/template.pm @@ -18,7 +18,6 @@ use config(); use params(); use project(); use log(); -use roles(); #use base 'Exporter'; our @EXPORT_OK = qw(check process exit_on_missing_permission clear_cache); @@ -45,26 +44,6 @@ sub process($$$$) { $params->{user} = $ENV{REMOTE_USER} unless defined $params->{user}; - my $user_permissions = roles::get_user_permissions($config); - for my $permission ( keys %$user_permissions ) { - $params->{$permission} = $user_permissions->{$permission} - if ( $user_permissions->{$permission} eq '1' ); - } - - $params->{jobs} = roles::get_user_jobs($config); - if ( ( $filename =~ /json\-p/ ) || (params::isJson) ) { - my $header = "Content-type:application/json; charset=utf-8\n\n"; - my $json = JSON->new->pretty(1)->canonical()->encode($params); - - $json = $header . $params->{json_callback} . $json; - if ( ( defined $_[1] ) && ( $_[1] eq 'print' ) ) { - print $json. "\n"; - } else { - $_[1] = $json . "\n"; - } - return; - } - unless ( -r $filename ) { log::error( $config, qq{template "$filename" does not exist} ) unless -e $filename; log::error( $config, qq{missing permissions to read "$filename"} ); @@ -207,22 +186,5 @@ sub check($;$$) { return $template; } -#deprecated (for old admin only) -sub exit_on_missing_permission($$) { - my $config = shift; - my $permission = shift; - - my $user_permissions = roles::get_user_permissions($config); - if ( $user_permissions->{$permission} ne '1' ) { - print STDERR "missing permission to $permission\n"; - template::process( - $config, 'print', - template::check( $config, 'default.html' ), - { error => 'sorry, missing permission!' } - ); - die(); - } -} - #do not delete last line! 1; diff --git a/website/agenda/planung/assign-series.cgi b/website/agenda/planung/assign-series.cgi index 075a713..1c60f2e 100755 --- a/website/agenda/planung/assign-series.cgi +++ b/website/agenda/planung/assign-series.cgi @@ -15,7 +15,6 @@ use log(); use template(); use auth(); use uac(); -use roles(); use project(); use studios(); use events(); diff --git a/website/agenda/planung/assignments.cgi b/website/agenda/planung/assignments.cgi index c8c4213..1b12bb3 100755 --- a/website/agenda/planung/assignments.cgi +++ b/website/agenda/planung/assignments.cgi @@ -14,7 +14,6 @@ use log(); use template(); use auth(); use uac(); -use roles(); use project(); use studios(); use events(); diff --git a/website/agenda/planung/calendar.cgi b/website/agenda/planung/calendar.cgi index 092d11f..bf58fc9 100755 --- a/website/agenda/planung/calendar.cgi +++ b/website/agenda/planung/calendar.cgi @@ -20,7 +20,6 @@ use template(); use calendar(); use auth(); use uac(); -use roles(); use project(); use studios(); use events(); diff --git a/website/agenda/planung/event.cgi b/website/agenda/planung/event.cgi index 8770a96..e06d651 100755 --- a/website/agenda/planung/event.cgi +++ b/website/agenda/planung/event.cgi @@ -20,7 +20,6 @@ use db(); use auth(); use uac(); -#use roles; use time(); use markup(); use project(); diff --git a/website/agenda/planung/help.cgi b/website/agenda/planung/help.cgi index ed2ce3b..9b2b9b7 100755 --- a/website/agenda/planung/help.cgi +++ b/website/agenda/planung/help.cgi @@ -14,7 +14,6 @@ use log(); use template(); use auth(); use uac(); -use roles(); use studios(); use markup(); use localization(); diff --git a/website/agenda/planung/playout.cgi b/website/agenda/planung/playout.cgi index ef07329..9d123f5 100755 --- a/website/agenda/planung/playout.cgi +++ b/website/agenda/planung/playout.cgi @@ -15,7 +15,6 @@ use log(); use template(); use auth(); use uac(); -use roles(); use project(); use studios(); use events(); diff --git a/website/agenda/planung/projects.cgi b/website/agenda/planung/projects.cgi index f48ac9d..2db400f 100755 --- a/website/agenda/planung/projects.cgi +++ b/website/agenda/planung/projects.cgi @@ -12,7 +12,6 @@ use params(); use log(); use template(); use auth(); -use roles(); use uac(); use studios(); use series(); @@ -26,7 +25,6 @@ my $config = config::get('../config/config.cgi'); my ( $user, $expires ) = auth::get_user( $config, $params, $cgi ); return if ( $user eq '' ); -my $permissions = roles::get_user_permissions($config); my $user_presets = uac::get_user_presets( $config, { diff --git a/website/agenda/planung/roles.cgi b/website/agenda/planung/roles.cgi index 5cce20a..6a31e79 100755 --- a/website/agenda/planung/roles.cgi +++ b/website/agenda/planung/roles.cgi @@ -12,7 +12,6 @@ use entry(); use log(); use template(); use auth(); -use roles(); use uac(); use studios(); use localization(); diff --git a/website/agenda/planung/series.cgi b/website/agenda/planung/series.cgi index 631aa54..538cc89 100755 --- a/website/agenda/planung/series.cgi +++ b/website/agenda/planung/series.cgi @@ -16,7 +16,6 @@ use log(); use template(); use auth(); use uac(); -use roles(); use project(); use studios(); use events(); diff --git a/website/agenda/planung/studio-timeslots.cgi b/website/agenda/planung/studio-timeslots.cgi index 8903ee6..91cf393 100755 --- a/website/agenda/planung/studio-timeslots.cgi +++ b/website/agenda/planung/studio-timeslots.cgi @@ -14,7 +14,6 @@ use log(); use template(); use auth(); use uac(); -use roles(); use project(); use studios(); use studio_timeslot_schedule(); diff --git a/website/agenda/planung/studios.cgi b/website/agenda/planung/studios.cgi index e016cb1..463d754 100755 --- a/website/agenda/planung/studios.cgi +++ b/website/agenda/planung/studios.cgi @@ -12,7 +12,6 @@ use params(); use log(); use template(); use auth(); -use roles(); use uac(); use studios(); use series(); @@ -26,7 +25,6 @@ my $config = config::get('../config/config.cgi'); my ( $user, $expires ) = auth::get_user( $config, $params, $cgi ); return if ( $user eq '' ); -my $permissions = roles::get_user_permissions($config); my $user_presets = uac::get_user_presets( $config, { diff --git a/website/agenda/planung/user-settings.cgi b/website/agenda/planung/user-settings.cgi index 29245ca..d123ae8 100755 --- a/website/agenda/planung/user-settings.cgi +++ b/website/agenda/planung/user-settings.cgi @@ -13,7 +13,6 @@ use template(); use auth(); use entry(); use uac(); -use roles(); use project(); use studios(); use params(); diff --git a/website/agenda/planung/user-stats.cgi b/website/agenda/planung/user-stats.cgi index 255faa8..ca26920 100755 --- a/website/agenda/planung/user-stats.cgi +++ b/website/agenda/planung/user-stats.cgi @@ -12,7 +12,6 @@ use log(); use template(); use auth(); use uac(); -use roles(); use project(); use studios(); use params(); diff --git a/website/agenda/planung/users.cgi b/website/agenda/planung/users.cgi index e5eff65..e25d6ac 100755 --- a/website/agenda/planung/users.cgi +++ b/website/agenda/planung/users.cgi @@ -12,7 +12,6 @@ use log(); use template(); use auth(); use uac(); -use roles(); use studios(); use params(); use localization(); diff --git a/website/agenda/planung/work-time.cgi b/website/agenda/planung/work-time.cgi index c295cb0..fee2fba 100755 --- a/website/agenda/planung/work-time.cgi +++ b/website/agenda/planung/work-time.cgi @@ -13,7 +13,6 @@ use log(); use template(); use auth(); use uac(); -use roles(); use project(); use studios(); use work_schedule(); From 2c0bf5887bd22c307b66446460894fce4382e86e Mon Sep 17 00:00:00 2001 From: Milan Date: Tue, 21 Mar 2023 23:11:33 +0100 Subject: [PATCH 6/7] uac.pm: add admin permission admin permission is no more dependent on the name of the role, but can be assigned to any role. Users assigned to admin role have all permissions. --- install/create.sql | 11 ++++++----- install/migrate.sql | 4 ++++ lib/calcms/uac.pm | 7 ++++++- website/agenda/planung/roles.cgi | 9 +++++++-- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/install/create.sql b/install/create.sql index 4224b2a..ec19e47 100644 --- a/install/create.sql +++ b/install/create.sql @@ -542,6 +542,7 @@ CREATE TABLE `calcms_roles` ( `studio_id` int unsigned NOT NULL, `role` varchar(40) NOT NULL, `level` tinyint unsigned NOT NULL DEFAULT '0', + `admin` INT(1) UNSIGNED NOT NULL DEFAULT 0, `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, `modified_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `read_role` tinyint unsigned DEFAULT NULL, @@ -635,11 +636,11 @@ CREATE TABLE `calcms_roles` ( LOCK TABLES `calcms_roles` WRITE; /*!40000 ALTER TABLE `calcms_roles` DISABLE KEYS */; -INSERT INTO `calcms_roles` (`id`, `project_id`, `studio_id`, `role`, `level`, `created_at`, `modified_at`, `read_role`, `update_role`, `read_user_role`, `create_user`, `read_user`, `update_user`, `delete_user`, `update_user_role`, `disable_user`, `create_project`, `read_project`, `update_project`, `delete_project`, `assign_project_studio`, `create_studio`, `read_studio`, `update_studio`, `delete_studio`, `read_studio_timeslot_schedule`, `update_studio_timeslot_schedule`, `create_series`, `read_series`, `update_series`, `delete_series`, `update_series_template`, `assign_series_member`, `remove_series_member`, `scan_series_events`, `assign_series_events`, `read_schedule`, `update_schedule`, `delete_schedule`, `create_event`, `create_event_from_schedule`, `create_event_of_series`, `read_event`, `delete_event`, `update_event_of_series`, `update_event_of_others`, `update_event_time`, `update_event_after_week`, `update_event_field_title`, `update_event_field_title_extension`, `update_event_field_excerpt`, `update_event_field_content`, `update_event_field_content_format`, `update_event_field_description`, `update_event_field_topic`, `update_event_field_episode`, `update_event_field_excerpt_extension`, `update_event_field_image`, `update_event_field_podcast_url`, `update_event_field_archive_url`, `update_event_status_disable_event_sync`, `update_event_status_published`, `update_event_status_rerun`, `update_event_status_draft`, `update_event_status_live`, `update_event_status_playout`, `update_event_status_archived`, `create_image`, `update_image_own`, `read_image`, `delete_image_own`, `update_image_others`, `delete_image_others`, `read_changes`, `undo_changes`, `read_user_stats`, `read_comment`, `update_comment_status_lock`, `update_comment_status_read`, `upload_audio_recordings`, `delete_audio_recordings`, `read_playout`, `create_download`) VALUES (7,1,1,'Admin',7,NULL,'2023-02-19 21:32:32',1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `calcms_roles` (`id`, `project_id`, `studio_id`, `role`, `level`, `created_at`, `modified_at`, `read_role`, `update_role`, `read_user_role`, `create_user`, `read_user`, `update_user`, `delete_user`, `update_user_role`, `disable_user`, `create_project`, `read_project`, `update_project`, `delete_project`, `assign_project_studio`, `create_studio`, `read_studio`, `update_studio`, `delete_studio`, `read_studio_timeslot_schedule`, `update_studio_timeslot_schedule`, `create_series`, `read_series`, `update_series`, `delete_series`, `update_series_template`, `assign_series_member`, `remove_series_member`, `scan_series_events`, `assign_series_events`, `read_schedule`, `update_schedule`, `delete_schedule`, `create_event`, `create_event_from_schedule`, `create_event_of_series`, `read_event`, `delete_event`, `update_event_of_series`, `update_event_of_others`, `update_event_time`, `update_event_after_week`, `update_event_field_title`, `update_event_field_title_extension`, `update_event_field_excerpt`, `update_event_field_content`, `update_event_field_content_format`, `update_event_field_description`, `update_event_field_topic`, `update_event_field_episode`, `update_event_field_excerpt_extension`, `update_event_field_image`, `update_event_field_podcast_url`, `update_event_field_archive_url`, `update_event_status_disable_event_sync`, `update_event_status_published`, `update_event_status_rerun`, `update_event_status_draft`, `update_event_status_live`, `update_event_status_playout`, `update_event_status_archived`, `create_image`, `update_image_own`, `read_image`, `delete_image_own`, `update_image_others`, `delete_image_others`, `read_changes`, `undo_changes`, `read_user_stats`, `read_comment`, `update_comment_status_lock`, `update_comment_status_read`, `upload_audio_recordings`, `delete_audio_recordings`, `read_playout`, `create_download`) VALUES (3,1,1,'Studio Manager',6,NULL,'2023-02-19 21:32:32',1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,0,1,1,0,0,1,1,1,1); -INSERT INTO `calcms_roles` (`id`, `project_id`, `studio_id`, `role`, `level`, `created_at`, `modified_at`, `read_role`, `update_role`, `read_user_role`, `create_user`, `read_user`, `update_user`, `delete_user`, `update_user_role`, `disable_user`, `create_project`, `read_project`, `update_project`, `delete_project`, `assign_project_studio`, `create_studio`, `read_studio`, `update_studio`, `delete_studio`, `read_studio_timeslot_schedule`, `update_studio_timeslot_schedule`, `create_series`, `read_series`, `update_series`, `delete_series`, `update_series_template`, `assign_series_member`, `remove_series_member`, `scan_series_events`, `assign_series_events`, `read_schedule`, `update_schedule`, `delete_schedule`, `create_event`, `create_event_from_schedule`, `create_event_of_series`, `read_event`, `delete_event`, `update_event_of_series`, `update_event_of_others`, `update_event_time`, `update_event_after_week`, `update_event_field_title`, `update_event_field_title_extension`, `update_event_field_excerpt`, `update_event_field_content`, `update_event_field_content_format`, `update_event_field_description`, `update_event_field_topic`, `update_event_field_episode`, `update_event_field_excerpt_extension`, `update_event_field_image`, `update_event_field_podcast_url`, `update_event_field_archive_url`, `update_event_status_disable_event_sync`, `update_event_status_published`, `update_event_status_rerun`, `update_event_status_draft`, `update_event_status_live`, `update_event_status_playout`, `update_event_status_archived`, `create_image`, `update_image_own`, `read_image`, `delete_image_own`, `update_image_others`, `delete_image_others`, `read_changes`, `undo_changes`, `read_user_stats`, `read_comment`, `update_comment_status_lock`, `update_comment_status_read`, `upload_audio_recordings`, `delete_audio_recordings`, `read_playout`, `create_download`) VALUES (1,1,1,'Program Planing',4,NULL,'2023-02-19 21:32:32',1,0,1,1,1,1,0,1,0,0,0,0,0,0,0,1,0,0,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1); -INSERT INTO `calcms_roles` (`id`, `project_id`, `studio_id`, `role`, `level`, `created_at`, `modified_at`, `read_role`, `update_role`, `read_user_role`, `create_user`, `read_user`, `update_user`, `delete_user`, `update_user_role`, `disable_user`, `create_project`, `read_project`, `update_project`, `delete_project`, `assign_project_studio`, `create_studio`, `read_studio`, `update_studio`, `delete_studio`, `read_studio_timeslot_schedule`, `update_studio_timeslot_schedule`, `create_series`, `read_series`, `update_series`, `delete_series`, `update_series_template`, `assign_series_member`, `remove_series_member`, `scan_series_events`, `assign_series_events`, `read_schedule`, `update_schedule`, `delete_schedule`, `create_event`, `create_event_from_schedule`, `create_event_of_series`, `read_event`, `delete_event`, `update_event_of_series`, `update_event_of_others`, `update_event_time`, `update_event_after_week`, `update_event_field_title`, `update_event_field_title_extension`, `update_event_field_excerpt`, `update_event_field_content`, `update_event_field_content_format`, `update_event_field_description`, `update_event_field_topic`, `update_event_field_episode`, `update_event_field_excerpt_extension`, `update_event_field_image`, `update_event_field_podcast_url`, `update_event_field_archive_url`, `update_event_status_disable_event_sync`, `update_event_status_published`, `update_event_status_rerun`, `update_event_status_draft`, `update_event_status_live`, `update_event_status_playout`, `update_event_status_archived`, `create_image`, `update_image_own`, `read_image`, `delete_image_own`, `update_image_others`, `delete_image_others`, `read_changes`, `undo_changes`, `read_user_stats`, `read_comment`, `update_comment_status_lock`, `update_comment_status_read`, `upload_audio_recordings`, `delete_audio_recordings`, `read_playout`, `create_download`) VALUES (2,1,1,'Editorial',2,NULL,'2023-02-19 21:32:32',0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,1,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,1); -INSERT INTO `calcms_roles` (`id`, `project_id`, `studio_id`, `role`, `level`, `created_at`, `modified_at`, `read_role`, `update_role`, `read_user_role`, `create_user`, `read_user`, `update_user`, `delete_user`, `update_user_role`, `disable_user`, `create_project`, `read_project`, `update_project`, `delete_project`, `assign_project_studio`, `create_studio`, `read_studio`, `update_studio`, `delete_studio`, `read_studio_timeslot_schedule`, `update_studio_timeslot_schedule`, `create_series`, `read_series`, `update_series`, `delete_series`, `update_series_template`, `assign_series_member`, `remove_series_member`, `scan_series_events`, `assign_series_events`, `read_schedule`, `update_schedule`, `delete_schedule`, `create_event`, `create_event_from_schedule`, `create_event_of_series`, `read_event`, `delete_event`, `update_event_of_series`, `update_event_of_others`, `update_event_time`, `update_event_after_week`, `update_event_field_title`, `update_event_field_title_extension`, `update_event_field_excerpt`, `update_event_field_content`, `update_event_field_content_format`, `update_event_field_description`, `update_event_field_topic`, `update_event_field_episode`, `update_event_field_excerpt_extension`, `update_event_field_image`, `update_event_field_podcast_url`, `update_event_field_archive_url`, `update_event_status_disable_event_sync`, `update_event_status_published`, `update_event_status_rerun`, `update_event_status_draft`, `update_event_status_live`, `update_event_status_playout`, `update_event_status_archived`, `create_image`, `update_image_own`, `read_image`, `delete_image_own`, `update_image_others`, `delete_image_others`, `read_changes`, `undo_changes`, `read_user_stats`, `read_comment`, `update_comment_status_lock`, `update_comment_status_read`, `upload_audio_recordings`, `delete_audio_recordings`, `read_playout`, `create_download`) VALUES (25,1,1,'Guest',1,NULL,'2023-02-19 21:32:32',0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); +INSERT INTO `calcms_roles` (`id`, `project_id`, `studio_id`, `role`, `level`, `admin`, `created_at`, `modified_at`, `read_role`, `update_role`, `read_user_role`, `create_user`, `read_user`, `update_user`, `delete_user`, `update_user_role`, `disable_user`, `create_project`, `read_project`, `update_project`, `delete_project`, `assign_project_studio`, `create_studio`, `read_studio`, `update_studio`, `delete_studio`, `read_studio_timeslot_schedule`, `update_studio_timeslot_schedule`, `create_series`, `read_series`, `update_series`, `delete_series`, `update_series_template`, `assign_series_member`, `remove_series_member`, `scan_series_events`, `assign_series_events`, `read_schedule`, `update_schedule`, `delete_schedule`, `create_event`, `create_event_from_schedule`, `create_event_of_series`, `read_event`, `delete_event`, `update_event_of_series`, `update_event_of_others`, `update_event_time`, `update_event_after_week`, `update_event_field_title`, `update_event_field_title_extension`, `update_event_field_excerpt`, `update_event_field_content`, `update_event_field_content_format`, `update_event_field_description`, `update_event_field_topic`, `update_event_field_episode`, `update_event_field_excerpt_extension`, `update_event_field_image`, `update_event_field_podcast_url`, `update_event_field_archive_url`, `update_event_status_disable_event_sync`, `update_event_status_published`, `update_event_status_rerun`, `update_event_status_draft`, `update_event_status_live`, `update_event_status_playout`, `update_event_status_archived`, `create_image`, `update_image_own`, `read_image`, `delete_image_own`, `update_image_others`, `delete_image_others`, `read_changes`, `undo_changes`, `read_user_stats`, `read_comment`, `update_comment_status_lock`, `update_comment_status_read`, `upload_audio_recordings`, `delete_audio_recordings`, `read_playout`, `create_download`) VALUES (7,1,1,'Admin',7,1,NULL,'2023-02-19 21:32:32',1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `calcms_roles` (`id`, `project_id`, `studio_id`, `role`, `level`, `admin`, `created_at`, `modified_at`, `read_role`, `update_role`, `read_user_role`, `create_user`, `read_user`, `update_user`, `delete_user`, `update_user_role`, `disable_user`, `create_project`, `read_project`, `update_project`, `delete_project`, `assign_project_studio`, `create_studio`, `read_studio`, `update_studio`, `delete_studio`, `read_studio_timeslot_schedule`, `update_studio_timeslot_schedule`, `create_series`, `read_series`, `update_series`, `delete_series`, `update_series_template`, `assign_series_member`, `remove_series_member`, `scan_series_events`, `assign_series_events`, `read_schedule`, `update_schedule`, `delete_schedule`, `create_event`, `create_event_from_schedule`, `create_event_of_series`, `read_event`, `delete_event`, `update_event_of_series`, `update_event_of_others`, `update_event_time`, `update_event_after_week`, `update_event_field_title`, `update_event_field_title_extension`, `update_event_field_excerpt`, `update_event_field_content`, `update_event_field_content_format`, `update_event_field_description`, `update_event_field_topic`, `update_event_field_episode`, `update_event_field_excerpt_extension`, `update_event_field_image`, `update_event_field_podcast_url`, `update_event_field_archive_url`, `update_event_status_disable_event_sync`, `update_event_status_published`, `update_event_status_rerun`, `update_event_status_draft`, `update_event_status_live`, `update_event_status_playout`, `update_event_status_archived`, `create_image`, `update_image_own`, `read_image`, `delete_image_own`, `update_image_others`, `delete_image_others`, `read_changes`, `undo_changes`, `read_user_stats`, `read_comment`, `update_comment_status_lock`, `update_comment_status_read`, `upload_audio_recordings`, `delete_audio_recordings`, `read_playout`, `create_download`) VALUES (3,1,1,'Studio Manager',6,0,NULL,'2023-02-19 21:32:32',1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,0,1,1,0,0,1,1,1,1); +INSERT INTO `calcms_roles` (`id`, `project_id`, `studio_id`, `role`, `level`, `admin`, `created_at`, `modified_at`, `read_role`, `update_role`, `read_user_role`, `create_user`, `read_user`, `update_user`, `delete_user`, `update_user_role`, `disable_user`, `create_project`, `read_project`, `update_project`, `delete_project`, `assign_project_studio`, `create_studio`, `read_studio`, `update_studio`, `delete_studio`, `read_studio_timeslot_schedule`, `update_studio_timeslot_schedule`, `create_series`, `read_series`, `update_series`, `delete_series`, `update_series_template`, `assign_series_member`, `remove_series_member`, `scan_series_events`, `assign_series_events`, `read_schedule`, `update_schedule`, `delete_schedule`, `create_event`, `create_event_from_schedule`, `create_event_of_series`, `read_event`, `delete_event`, `update_event_of_series`, `update_event_of_others`, `update_event_time`, `update_event_after_week`, `update_event_field_title`, `update_event_field_title_extension`, `update_event_field_excerpt`, `update_event_field_content`, `update_event_field_content_format`, `update_event_field_description`, `update_event_field_topic`, `update_event_field_episode`, `update_event_field_excerpt_extension`, `update_event_field_image`, `update_event_field_podcast_url`, `update_event_field_archive_url`, `update_event_status_disable_event_sync`, `update_event_status_published`, `update_event_status_rerun`, `update_event_status_draft`, `update_event_status_live`, `update_event_status_playout`, `update_event_status_archived`, `create_image`, `update_image_own`, `read_image`, `delete_image_own`, `update_image_others`, `delete_image_others`, `read_changes`, `undo_changes`, `read_user_stats`, `read_comment`, `update_comment_status_lock`, `update_comment_status_read`, `upload_audio_recordings`, `delete_audio_recordings`, `read_playout`, `create_download`) VALUES (1,1,1,'Program Planing',4,0,NULL,'2023-02-19 21:32:32',1,0,1,1,1,1,0,1,0,0,0,0,0,0,0,1,0,0,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1); +INSERT INTO `calcms_roles` (`id`, `project_id`, `studio_id`, `role`, `level`, `admin`, `created_at`, `modified_at`, `read_role`, `update_role`, `read_user_role`, `create_user`, `read_user`, `update_user`, `delete_user`, `update_user_role`, `disable_user`, `create_project`, `read_project`, `update_project`, `delete_project`, `assign_project_studio`, `create_studio`, `read_studio`, `update_studio`, `delete_studio`, `read_studio_timeslot_schedule`, `update_studio_timeslot_schedule`, `create_series`, `read_series`, `update_series`, `delete_series`, `update_series_template`, `assign_series_member`, `remove_series_member`, `scan_series_events`, `assign_series_events`, `read_schedule`, `update_schedule`, `delete_schedule`, `create_event`, `create_event_from_schedule`, `create_event_of_series`, `read_event`, `delete_event`, `update_event_of_series`, `update_event_of_others`, `update_event_time`, `update_event_after_week`, `update_event_field_title`, `update_event_field_title_extension`, `update_event_field_excerpt`, `update_event_field_content`, `update_event_field_content_format`, `update_event_field_description`, `update_event_field_topic`, `update_event_field_episode`, `update_event_field_excerpt_extension`, `update_event_field_image`, `update_event_field_podcast_url`, `update_event_field_archive_url`, `update_event_status_disable_event_sync`, `update_event_status_published`, `update_event_status_rerun`, `update_event_status_draft`, `update_event_status_live`, `update_event_status_playout`, `update_event_status_archived`, `create_image`, `update_image_own`, `read_image`, `delete_image_own`, `update_image_others`, `delete_image_others`, `read_changes`, `undo_changes`, `read_user_stats`, `read_comment`, `update_comment_status_lock`, `update_comment_status_read`, `upload_audio_recordings`, `delete_audio_recordings`, `read_playout`, `create_download`) VALUES (2,1,1,'Editorial',2,0,NULL,'2023-02-19 21:32:32',0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,1,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,1); +INSERT INTO `calcms_roles` (`id`, `project_id`, `studio_id`, `role`, `level`, `admin`, `created_at`, `modified_at`, `read_role`, `update_role`, `read_user_role`, `create_user`, `read_user`, `update_user`, `delete_user`, `update_user_role`, `disable_user`, `create_project`, `read_project`, `update_project`, `delete_project`, `assign_project_studio`, `create_studio`, `read_studio`, `update_studio`, `delete_studio`, `read_studio_timeslot_schedule`, `update_studio_timeslot_schedule`, `create_series`, `read_series`, `update_series`, `delete_series`, `update_series_template`, `assign_series_member`, `remove_series_member`, `scan_series_events`, `assign_series_events`, `read_schedule`, `update_schedule`, `delete_schedule`, `create_event`, `create_event_from_schedule`, `create_event_of_series`, `read_event`, `delete_event`, `update_event_of_series`, `update_event_of_others`, `update_event_time`, `update_event_after_week`, `update_event_field_title`, `update_event_field_title_extension`, `update_event_field_excerpt`, `update_event_field_content`, `update_event_field_content_format`, `update_event_field_description`, `update_event_field_topic`, `update_event_field_episode`, `update_event_field_excerpt_extension`, `update_event_field_image`, `update_event_field_podcast_url`, `update_event_field_archive_url`, `update_event_status_disable_event_sync`, `update_event_status_published`, `update_event_status_rerun`, `update_event_status_draft`, `update_event_status_live`, `update_event_status_playout`, `update_event_status_archived`, `create_image`, `update_image_own`, `read_image`, `delete_image_own`, `update_image_others`, `delete_image_others`, `read_changes`, `undo_changes`, `read_user_stats`, `read_comment`, `update_comment_status_lock`, `update_comment_status_read`, `upload_audio_recordings`, `delete_audio_recordings`, `read_playout`, `create_download`) VALUES (25,1,1,'Guest',1,0,NULL,'2023-02-19 21:32:32',0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); /*!40000 ALTER TABLE `calcms_roles` ENABLE KEYS */; UNLOCK TABLES; diff --git a/install/migrate.sql b/install/migrate.sql index e5212df..97c0a64 100644 --- a/install/migrate.sql +++ b/install/migrate.sql @@ -300,3 +300,7 @@ CREATE TABLE `calcms_help_texts` ( PRIMARY KEY (`id`)); ALTER TABLE `calcms_roles` ADD COLUMN `edit_help_texts` INT(1) UNSIGNED NOT NULL; + +-- admin roles +ALTER TABLE `calcms_roles` ADD COLUMN `admin` INT(1) UNSIGNED NOT NULL DEFAULT 0 AFTER `level`; +update calcms_roles set admin=1 where role = 'Admin'; diff --git a/lib/calcms/uac.pm b/lib/calcms/uac.pm index 9dc1f06..cb4f837 100644 --- a/lib/calcms/uac.pm +++ b/lib/calcms/uac.pm @@ -456,7 +456,7 @@ sub get_admin_user_roles ($$) { my $query = qq{ select distinct r.*, ur.studio_id, ur.project_id from calcms_users u, calcms_user_roles ur, calcms_roles r - where ur.user_id=u.id and ur.role_id=r.id and r.role='Admin' + where ur.user_id=u.id and ur.role_id=r.id and r.admin=1 $conditions limit 1 }; @@ -735,6 +735,11 @@ sub get_user_presets($$) { my $permissions = uac::get_user_permissions( $config, { user => $user, project_id => $project_id, studio_id => $studio_id } ); + if ($permissions->{admin} == 1) { + for my $key (keys %$permissions) { + $permissions->{$key} = 1; + } + } #only admin is allowed to select all projects # if($permissions->{is_admin}==1){ diff --git a/website/agenda/planung/roles.cgi b/website/agenda/planung/roles.cgi index 6a31e79..ba02fb1 100755 --- a/website/agenda/planung/roles.cgi +++ b/website/agenda/planung/roles.cgi @@ -151,8 +151,14 @@ sub save_roles { } } elsif ( $column eq 'role' ) { $values->{$id}->{$column} = $value; + } elsif ( $column eq 'admin' ) { + if ( $permissions->{is_admin} ){ + $values->{$id}->{$column} = $value; + } else { + uac::permissions_denied("set admin!"); + return; + } } elsif ( $column eq 'id' || $column eq 'project_id' || $column eq 'studio_id' ) { - #id and studio id will be set later } else { $values->{$id}->{$column} = 1 if ( $value =~ /^\d+$/ ); @@ -309,7 +315,6 @@ sub show_roles { } for my $role (@$roles) { - my $id = $role->{id} || ''; my $value = $role->{role} || ''; my $style = ''; From 1709694d8e0d3e1044fa1fad8bcc0c36c49eec3f Mon Sep 17 00:00:00 2001 From: Milan Date: Tue, 21 Mar 2023 23:23:14 +0100 Subject: [PATCH 7/7] studios: remove google_calendar field --- install/create.sql | 3 +-- install/migrate.sql | 2 ++ website/agenda/planung/pot/de/studios.po | 3 --- website/agenda/planung/pot/en/studios.po | 4 ---- website/agenda/planung/studios.cgi | 2 +- 5 files changed, 4 insertions(+), 10 deletions(-) diff --git a/install/create.sql b/install/create.sql index ec19e47..303bc52 100644 --- a/install/create.sql +++ b/install/create.sql @@ -1307,7 +1307,6 @@ CREATE TABLE `calcms_studios` ( `location` varchar(100) NOT NULL, `stream` varchar(100) NOT NULL, `image` varchar(200) NOT NULL, - `google_calendar` varchar(100) NOT NULL, `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, `modified_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) USING BTREE, @@ -1323,7 +1322,7 @@ CREATE TABLE `calcms_studios` ( LOCK TABLES `calcms_studios` WRITE; /*!40000 ALTER TABLE `calcms_studios` DISABLE KEYS */; -INSERT INTO `calcms_studios` (`id`, `name`, `description`, `location`, `stream`, `image`, `google_calendar`, `created_at`, `modified_at`) VALUES (1,'My Studio','My Radio Studio','studio','','','https://my-radio.org',NULL,'2023-02-19 21:17:18'); +INSERT INTO `calcms_studios` (`id`, `name`, `description`, `location`, `stream`, `image`, `created_at`, `modified_at`) VALUES (1,'My Studio','My Radio Studio','studio','','',NULL,'2023-02-19 21:17:18'); /*!40000 ALTER TABLE `calcms_studios` ENABLE KEYS */; UNLOCK TABLES; diff --git a/install/migrate.sql b/install/migrate.sql index 97c0a64..519c6db 100644 --- a/install/migrate.sql +++ b/install/migrate.sql @@ -304,3 +304,5 @@ ALTER TABLE `calcms_roles` ADD COLUMN `edit_help_texts` INT(1) UNSIGNED NOT NULL -- admin roles ALTER TABLE `calcms_roles` ADD COLUMN `admin` INT(1) UNSIGNED NOT NULL DEFAULT 0 AFTER `level`; update calcms_roles set admin=1 where role = 'Admin'; + +ALTER TABLE calcms_studios DROP COLUMN google_calendar; diff --git a/website/agenda/planung/pot/de/studios.po b/website/agenda/planung/pot/de/studios.po index 52281d4..c94daa4 100644 --- a/website/agenda/planung/pot/de/studios.po +++ b/website/agenda/planung/pot/de/studios.po @@ -40,6 +40,3 @@ msgstr "Logo" msgid "label_stream" msgstr "Stream-URL" -msgid "label_google_calendar" -msgstr "Google Kalender" - diff --git a/website/agenda/planung/pot/en/studios.po b/website/agenda/planung/pot/en/studios.po index 278f28d..16beb46 100644 --- a/website/agenda/planung/pot/en/studios.po +++ b/website/agenda/planung/pot/en/studios.po @@ -39,7 +39,3 @@ msgstr "image" msgid "label_stream" msgstr "stream" - -msgid "label_google_calendar" -msgstr "google_calendar" - diff --git a/website/agenda/planung/studios.cgi b/website/agenda/planung/studios.cgi index 463d754..9017967 100755 --- a/website/agenda/planung/studios.cgi +++ b/website/agenda/planung/studios.cgi @@ -218,7 +218,7 @@ sub check_params { $checked->{action} = entry::element_of( $params->{action}, ['save', 'delete']); entry::set_strings( $checked, $params, [ - 'name', 'description', 'location', 'stream', 'google_calendar', 'image', 'setImage' ]); + 'name', 'description', 'location', 'stream', 'image', 'setImage' ]); entry::set_numbers( $checked, $params, [ 'project_id', 'studio_id', 'default_studio_id', 'id'