From: Moritz Bunkus Date: Thu, 29 Aug 2013 11:19:52 +0000 (+0200) Subject: Einträge in employee aus User->login heraus aktualisieren X-Git-Tag: release-3.1.0beta1~69^2~8^2~1 X-Git-Url: http://wagnertech.de/git?a=commitdiff_plain;h=7447778283539ba5f36a43c97fcea3bc4f551729;p=kivitendo-erp.git Einträge in employee aus User->login heraus aktualisieren Vor der Mandanteneinführung war User->login bereits hierfür verantwortlich. Dann wurde diese Funktionalität in den Login-Controller verschoben. Allerdings kehrt die Ausführung in exakt einem Fall nicht zum Logincontroller zurück: wenn noch Datenbankupgrades eingespielt werden müssen. In dem Fall werden die Updates eingespielt, dem User wird die "Weiter"-Seite angezeigt, und von hier aus geht es direkt zum company_logo. User->login weiß daher als einzige Instanz, wann alle DB-Upgrades User->installiert sind, und damit, wann RDBO-Instanzen sicher genutzt User->werden können. Daher die Funktionalität in die Employee-Manager-Klasse verschoben und das Triggern der Funktion aus dem Login-Controller wieder zurück nach User->login verschoben. Fixt #2361. --- diff --git a/SL/Controller/LoginScreen.pm b/SL/Controller/LoginScreen.pm index e84a31505..adf8b471c 100644 --- a/SL/Controller/LoginScreen.pm +++ b/SL/Controller/LoginScreen.pm @@ -111,8 +111,6 @@ sub keep_auth_vars_in_form { sub _redirect_to_main_script { my ($self) = @_; - $self->_ensure_employees_for_authorized_users_exist; - return $self->redirect_to($::form->{callback}) if $::form->{callback}; $self->redirect_to(controller => "login.pl", action => 'company_logo'); @@ -153,23 +151,6 @@ sub _redirect_to_main_script_if_already_logged_in { return 1; } -sub _ensure_employees_for_authorized_users_exist { - my ($self) = @_; - - my %employees_by_login = map { ($_->login => $_) } @{ SL::DB::Manager::Employee->get_all }; - - foreach my $user (@{ SL::DB::AuthClient->new(id => $::auth->client->{id})->load->users || [] }) { - my $user_config = $user->config_values; - my $employee = $employees_by_login{$user->login} || SL::DB::Employee->new(login => $user->login); - - $employee->update_attributes( - name => $user_config->{name}, - workphone => $user_config->{tel}, - deleted => 0, - ); - } -} - sub error_state { my %states = ( session => { warning => t8('The session has expired. Please log in again.') }, diff --git a/SL/DB/Manager/Employee.pm b/SL/DB/Manager/Employee.pm index 6577c7757..b4ebf1444 100644 --- a/SL/DB/Manager/Employee.pm +++ b/SL/DB/Manager/Employee.pm @@ -14,4 +14,71 @@ sub current { return shift->find_by(login => $::form->{login}); } +sub update_entries_for_authorized_users { + my ($class) = @_; + + my %employees_by_login = map { ($_->login => $_) } @{ $class->get_all }; + + require SL::DB::AuthClient; + foreach my $user (@{ SL::DB::AuthClient->new(id => $::auth->client->{id})->load->users || [] }) { + my $user_config = $user->config_values; + my $employee = $employees_by_login{$user->login} || SL::DB::Employee->new(login => $user->login); + + $employee->update_attributes( + name => $user_config->{name}, + workphone => $user_config->{tel}, + deleted => 0, + ); + } +} + 1; +__END__ + +=pod + +=encoding utf8 + +=head1 NAME + +SL::DB::Manager::Employee - RDBO manager for the C table + +=head1 SYNOPSIS + + my $logged_in_employee = SL::DB::Manager::Employee->current; + +=head1 FUNCTIONS + +=over 4 + +=item C + +Returns an RDBO instance corresponding to the currently logged-in user. + +=item C + +For each user created by the administrator in the admin section an +entry only exists in the authentication table, but not in the employee +table. This is where this function comes in: It iterates over all +authentication users that have access to the current client and ensure +than an entry for them exists in the table C. The matching +is done via the login name which must be the same in both tables. + +The only other properties that will be copied from the authentication +table into the C row are C and C. In +addition C is always set to 0. + +The intention is that this function is called automatically during the +login process. + +=back + +=head1 BUGS + +Nothing here yet. + +=head1 AUTHOR + +Moritz Bunkus Em.bunkus@linet-services.deE + +=cut diff --git a/SL/User.pm b/SL/User.pm index a267fcd6f..e3f4a56c4 100644 --- a/SL/User.pm +++ b/SL/User.pm @@ -39,6 +39,7 @@ use Fcntl qw(:seek); #use SL::Auth; use SL::DB::AuthClient; +use SL::DB::Employee; use SL::DBConnect; use SL::DBUpgrade2; use SL::DBUtils; @@ -126,7 +127,10 @@ sub login { my $update_available = $dbupdater->update2_available($dbh); $dbh->disconnect; - return LOGIN_OK() if !$update_available; + if (!$update_available) { + SL::DB::Manager::Employee->update_entries_for_authorized_users; + return LOGIN_OK(); + } $form->{$_} = $::auth->client->{$_} for qw(dbname dbhost dbport dbuser dbpasswd); $form->{$_} = $myconfig{$_} for qw(datestyle); @@ -151,6 +155,16 @@ sub login { $self->dbupdate2(form => $form, updater => $dbupdater, database => $::auth->client->{dbname}); + # If $self->dbupdate2 returns than this means all upgrade scripts + # have been applied successfully, none required user + # interaction. Otherwise the deeper layers would have called + # ::end_of_request() already, and return would not have returned to + # us. Therefore we can now use RDBO instances because their supposed + # table structures do match the actual structures. So let's ensure + # that the "employee" table contains the appropriate entries for all + # users authorized for the current client. + SL::DB::Manager::Employee->update_entries_for_authorized_users; + SL::System::InstallationLock->unlock; print $form->parse_html_template("dbupgrade/footer");