Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 288111da

Von Moritz Bunkus vor mehr als 11 Jahren hinzugefügt

  • ID 288111da982510d86d73db5cef54c52e07a84f5a
  • Vorgänger 32b79fa8
  • Nachfolger 0038d2a7

Admin: Anlegen, Bearbeiten und Löschen von Usern im Admin-Controller

Dazu auch "ON DELETE CASCADE" für alle foreign keys in auth.*

Fixt #2279, #2280.

Unterschiede anzeigen:

SL/Controller/Admin.pm
10 10
use SL::DB::AuthGroup;
11 11
use SL::Helper::Flash;
12 12
use SL::Locale::String qw(t8);
13
use SL::User;
13 14

  
14 15
use Rose::Object::MakeMethods::Generic
15 16
(
16
  'scalar --get_set_init' => [ qw(client user nologin_file_name db_cfg) ],
17
  'scalar --get_set_init' => [ qw(client user nologin_file_name db_cfg all_dateformats all_numberformats all_countrycodes all_stylesheets all_menustyles all_clients all_groups) ],
17 18
);
18 19

  
19 20
__PACKAGE__->run_before(\&setup_layout);
......
25 26
}
26 27

  
27 28
#
28
# actions
29
# actions: login, logout
29 30
#
30 31

  
31 32
sub action_login {
......
35 36
  return                   if !$self->authenticate_root;
36 37
  return                   if !$self->check_auth_db_and_tables;
37 38
  return                   if  $self->apply_dbupgrade_scripts;
38
  $self->redirect_to(action => 'list_clients_and_users');
39
  $self->redirect_to(action => 'show');
39 40
}
40 41

  
41 42
sub action_logout {
......
44 45
  $self->redirect_to(action => 'login');
45 46
}
46 47

  
48
#
49
# actions: creating the authentication database & tables, applying database ugprades
50
#
51

  
47 52
sub action_apply_dbupgrade_scripts {
48 53
  my ($self) = @_;
49 54

  
50 55
  return if $self->apply_dbupgrade_scripts;
51
  $self->action_list_clients_and_users;
56
  $self->action_show;
52 57
}
53 58

  
54 59
sub action_create_auth_db {
......
81 86
  }
82 87
}
83 88

  
84
sub action_list_clients_and_users {
89
#
90
# actions: users
91
#
92

  
93
sub action_show {
85 94
  my ($self) = @_;
86 95

  
87 96
  $self->render(
88
    "admin/list_users",
97
    "admin/show",
89 98
    CLIENTS => SL::DB::Manager::AuthClient->get_all_sorted,
90 99
    USERS   => SL::DB::Manager::AuthUser->get_all_sorted,
91 100
    LOCKED  => (-e $self->nologin_file_name),
92
    title   => "kivitendo " . $::locale->text('Administration'),
101
    title   => "kivitendo " . t8('Administration'),
93 102
  );
94 103
}
95 104

  
105
sub action_new_user {
106
  my ($self) = @_;
107

  
108
  $self->user(SL::DB::AuthUser->new(
109
    config_values => {
110
      vclimit      => 200,
111
      countrycode  => "de",
112
      numberformat => "1.000,00",
113
      dateformat   => "dd.mm.yy",
114
      stylesheet   => "kivitendo.css",
115
      menustyle    => "neu",
116
    },
117
  ));
118

  
119
  $self->edit_user_form(title => t8('Create a new user'));
120
}
121

  
122
sub action_edit_user {
123
  my ($self) = @_;
124
  $self->edit_user_form(title => t8('Edit User'));
125
}
126

  
127
sub action_save_user {
128
  my ($self) = @_;
129
  my $params = delete($::form->{user})          || { };
130
  my $props  = delete($params->{config_values}) || { };
131
  my $is_new = !$params->{id};
132

  
133
  $self->user($is_new ? SL::DB::AuthUser->new : SL::DB::AuthUser->new(id => $params->{id})->load)
134
    ->assign_attributes(%{ $params })
135
    ->config_values({ %{ $self->user->config_values }, %{ $props } });
136

  
137
  my @errors = $self->user->validate;
138

  
139
  if (@errors) {
140
    flash('error', @errors);
141
    $self->edit_user_form(title => $is_new ? t8('Create a new user') : t8('Edit User'));
142
    return;
143
  }
144

  
145
  $self->user->save;
146

  
147
  if ($::auth->can_change_password && $::form->{new_password}) {
148
    $::auth->change_password($self->user->login, $::form->{new_password});
149
  }
150

  
151
  flash_later('info', $is_new ? t8('The user has been created.') : t8('The user has been saved.'));
152
  $self->redirect_to(action => 'show');
153
}
154

  
155
sub action_delete_user {
156
  my ($self) = @_;
157

  
158
  if (!$self->user->delete) {
159
    flash('error', t8('The user could not be deleted.'));
160
    $self->edit_user_form(title => t8('Edit User'));
161
    return;
162
  }
163

  
164
  flash_later('info', t8('The user has been deleted.'));
165
  $self->redirect_to(action => 'show');
166
}
167

  
168
#
169
# actions: locking, unlocking
170
#
171

  
96 172
sub action_unlock_system {
97 173
  my ($self) = @_;
98 174
  unlink $self->nologin_file_name;
99 175
  flash_later('info', t8('Lockfile removed!'));
100
  $self->redirect_to(action => 'list_clients_and_users');
176
  $self->redirect_to(action => 'show');
101 177
}
102 178

  
103 179
sub action_lock_system {
......
110 186
  } else {
111 187
    $fh->close;
112 188
    flash_later('info', t8('Lockfile created!'));
113
    $self->redirect_to(action => 'list_clients_and_users');
189
    $self->redirect_to(action => 'show');
114 190
  }
115 191
}
116 192

  
......
118 194
# initializers
119 195
#
120 196

  
121
sub init_db_cfg            { $::lx_office_conf{'authentication/database'}               }
122
sub init_nologin_file_name { $::lx_office_conf{paths}->{userspath} . '/nologin';        }
123
sub init_client            { SL::DB::AuthClient->new(id => $::form->{client_id})->load; }
124
sub init_user              { SL::DB::AuthUser  ->new(id => $::form->{user_id}  )->load; }
197
sub init_db_cfg            { $::lx_office_conf{'authentication/database'}                                            }
198
sub init_nologin_file_name { $::lx_office_conf{paths}->{userspath} . '/nologin';                                     }
199
sub init_client            { SL::DB::AuthClient->new(id => ($::form->{id} || ($::form->{client} || {})->{id}))->load }
200
sub init_user              { SL::DB::AuthUser  ->new(id => ($::form->{id} || ($::form->{user}   || {})->{id}))->load }
201
sub init_all_clients       { SL::DB::Manager::AuthClient->get_all_sorted                                             }
202
sub init_all_groups        { SL::DB::Manager::AuthGroup->get_all_sorted                                              }
203
sub init_all_dateformats   { [ qw(mm/dd/yy dd/mm/yy dd.mm.yy yyyy-mm-dd)      ]                                      }
204
sub init_all_numberformats { [ qw(1,000.00 1000.00 1.000,00 1000,00)          ]                                      }
205
sub init_all_stylesheets   { [ qw(lx-office-erp.css Mobile.css kivitendo.css) ]                                      }
206
sub init_all_menustyles    {
207
  return [
208
    { id => 'old', title => $::locale->text('Old (on the side)') },
209
    { id => 'v3',  title => $::locale->text('Top (CSS)') },
210
    { id => 'neu', title => $::locale->text('Top (Javascript)') },
211
  ];
212
}
213

  
214
sub init_all_countrycodes {
215
  my %cc = User->country_codes;
216
  return [ map { id => $_, title => $cc{$_} }, sort { $cc{$a} cmp $cc{$b} } keys %cc ];
217
}
125 218

  
126 219
#
127 220
# filters
......
136 229
}
137 230

  
138 231
#
139
# helpers
232
# displaying forms
140 233
#
141 234

  
142 235
sub login_form {
......
145 238
  $self->render('admin/adminlogin', title => t8('kivitendo v#1 administration', $::form->{version}), %params);
146 239
}
147 240

  
241
sub edit_user_form {
242
  my ($self, %params) = @_;
243

  
244
  $::request->layout->use_javascript("${_}.js") for qw(jquery.selectboxes jquery.multiselect2side);
245
  $self->render('admin/edit_user', %params);
246
}
247

  
248
#
249
# helpers
250
#
251

  
148 252
sub check_auth_db_and_tables {
149 253
  my ($self) = @_;
150 254

  
SL/DB/AuthUser.pm
36 36
  my ($self) = @_;
37 37

  
38 38
  my @errors;
39
  push @errors, $::locale->text('The login is missing.')          if !$self->login;
40
  push @errors, $::locale->text('The login is not unique.')          if !SL::DB::Helper::Util::is_unique($self, 'login');
41
  push @errors, "chunky bacon";
39
  push @errors, $::locale->text('The login is missing.')    if !$self->login;
40
  push @errors, $::locale->text('The login is not unique.') if !SL::DB::Helper::Util::is_unique($self, 'login');
42 41

  
43 42
  return @errors;
44 43
}
......
46 45
sub get_config_value {
47 46
  my ($self, $key) = @_;
48 47

  
49
  my $cfg = first { $_->cfg_key eq $key } @{ $self->configs };
48
  my $cfg = first { $_->cfg_key eq $key } @{ $self->configs || [] };
50 49
  return $cfg ? $cfg->cfg_value : undef;
51 50
}
52 51

  
......
58 57
    $self->configs([ map { SL::DB::AuthUserConfig->new(cfg_key => $_, cfg_value => $settings{$_}) } keys %settings ]);
59 58
  }
60 59

  
61
  return { map { ($_->cfg_key => $_->cfg_value) } @{ $self->configs } };
60
  return { map { ($_->cfg_key => $_->cfg_value) } @{ $self->configs || [] } };
62 61
}
63 62

  
64 63
1;
bin/mozilla/admin.pl
77 77
our $locale;
78 78
our $auth;
79 79

  
80
my @valid_dateformats = qw(mm/dd/yy dd/mm/yy dd.mm.yy yyyy-mm-dd);
81
my @valid_numberformats = ('1,000.00', '1000.00', '1.000,00', '1000,00');
82
my @all_stylesheets = qw(lx-office-erp.css Mobile.css kivitendo.css);
83
my @all_menustyles = (
84
  { id => 'old', title => $::locale->text('Old (on the side)') },
85
  { id => 'v3',  title => $::locale->text('Top (CSS)') },
86
  { id => 'neu', title => $::locale->text('Top (Javascript)') },
87
);
88

  
89 80
sub run {
90 81
  $::lxdebug->enter_sub;
91 82
  my $session_result = shift;
......
131 122
  print $form->parse_html_template('admin/adminlogin');
132 123
}
133 124

  
134
sub add_user {
135
  $::form->{title}   = "kivitendo " . $::locale->text('Administration') . " / " . $::locale->text('Add User');
136

  
137
  # User does not have a well behaved new constructor, so we'll just have to build one ourself
138
  my $user     = bless {
139
    "vclimit"      => 200,
140
    "countrycode"  => "de",
141
    "numberformat" => "1.000,00",
142
    "dateformat"   => "dd.mm.yy",
143
    "stylesheet"   => "kivitendo.css",
144
    "menustyle"    => "neu",
145
    dbport         => $::auth->{DB_config}->{port} || 5432,
146
    dbuser         => $::auth->{DB_config}->{user} || 'lxoffice',
147
    dbhost         => $::auth->{DB_config}->{host} || 'localhost',
148
  }, 'User';
149

  
150
  edit_user_form($user);
151
}
152

  
153
sub edit_user {
154
  $::form->{title} = "kivitendo " . $::locale->text('Administration') . " / " . $::locale->text('Edit User');
155
  $::form->{edit}  = 1;
156

  
157
  # get user
158
  my $user = User->new(id => $::form->{user}{id});
159

  
160
  edit_user_form($user);
161
}
162

  
163
sub edit_user_form {
164
  my ($user) = @_;
165

  
166
  my %cc = $user->country_codes;
167
  my @all_countrycodes = map { id => $_, title => $cc{$_} }, sort { $cc{$a} cmp $cc{$b} } keys %cc;
168
  my ($all_dir, $all_master) = _search_templates();
169
  my $groups = [];
170

  
171
  if ($::form->{edit}) {
172
    my $user_id    = $::auth->get_user_id($user->{login});
173
    my $all_groups = $::auth->read_groups();
174

  
175
    for my $group (values %{ $all_groups }) {
176
      push @{ $groups }, $group if (grep { $user_id == $_ } @{ $group->{members} });
177
    }
178

  
179
    $groups = [ sort { lc $a->{name} cmp lc $b->{name} } @{ $groups } ];
180
  }
181

  
182
  $::form->header;
183
  print $::form->parse_html_template("admin/edit_user", {
184
    GROUPS               => $groups,
185
    CAN_CHANGE_PASSWORD  => $::auth->can_change_password,
186
    user                 => $user->data,
187
    all_stylesheets      => \@all_stylesheets,
188
    all_numberformats    => \@valid_numberformats,
189
    all_dateformats      => \@valid_dateformats,
190
    all_countrycodes     => \@all_countrycodes,
191
    all_menustyles       => \@all_menustyles,
192
    all_templates        => $all_dir,
193
    all_master_templates => $all_master,
194
  });
195
}
196

  
197
sub save_user {
198
  my $form          = $main::form;
199
  my $locale        = $main::locale;
200

  
201
  my $user = $form->{user};
202

  
203
  $user->{dbdriver} = 'Pg';
204

  
205
  if (!$::form->{edit}) {
206
    # no spaces allowed in login name
207
    $user->{login} =~ s/\s//g;
208
    $::form->show_generic_error($::locale->text('Login name missing!')) unless $user->{login};
209

  
210
    # check for duplicates
211
    my %members = $::auth->read_all_users;
212
    if ($members{$user->{login}}) {
213
      $::form->show_generic_error($locale->text('Another user with the login #1 does already exist.', $user->{login}), 'back_button' => 1);
214
    }
215
  }
216

  
217
  # no spaces allowed in directories
218
  ($::form->{newtemplates}) = split / /, $::form->{newtemplates};
219
  $user->{templates} = $::form->{newtemplates} || $::form->{usetemplates} || $user->{login};
220

  
221
  # is there a basedir
222
  if (!-d $::lx_office_conf{paths}->{templates}) {
223
    $::form->error(sprintf($::locale->text("The directory %s does not exist."), $::lx_office_conf{paths}->{templates}));
224
  }
225

  
226
  # add base directory to $form->{templates}
227
  $user->{templates} =~ s|.*/||;
228
  $user->{templates} =  $::lx_office_conf{paths}->{templates} . "/$user->{templates}";
229

  
230
  my $myconfig = new User(id => $user->{id});
231

  
232
  $::form->show_generic_error($::locale->text('Dataset missing!'))       unless $user->{dbname};
233
  $::form->show_generic_error($::locale->text('Database User missing!')) unless $user->{dbuser};
234

  
235
  foreach my $item (keys %{$user}) {
236
    $myconfig->{$item} = $user->{$item};
237
  }
238

  
239
  $myconfig->save_member;
240

  
241
  $user->{templates}       =~ s|.*/||;
242
  $user->{templates}       =  $::lx_office_conf{paths}->{templates} . "/$user->{templates}";
243
  $::form->{mastertemplates} =~ s|.*/||;
244

  
245
  # create user template directory and copy master files
246
  if (!-d "$user->{templates}") {
247
    umask(002);
248

  
249
    if (mkdir "$user->{templates}", oct("771")) {
250

  
251
      umask(007);
252

  
253
      # copy templates to the directory
254

  
255
      my $oldcurrdir = getcwd();
256
      if (!chdir("$::lx_office_conf{paths}->{templates}/print/$::form->{mastertemplates}")) {
257
        $form->error("$ERRNO: chdir $::lx_office_conf{paths}->{templates}/print/$::form->{mastertemplates}");
258
      }
259

  
260
      my $newdir = File::Spec->catdir($oldcurrdir, $user->{templates});
261

  
262
      find(
263
        sub
264
        {
265
          next if ($_ eq ".");
266

  
267
          if (-d $_) {
268
            if (!mkdir (File::Spec->catdir($newdir, $File::Find::name))) {
269
              chdir($oldcurrdir);
270
              $form->error("$ERRNO: mkdir $File::Find::name");
271
            }
272
          } elsif (-l $_) {
273
            if (!symlink (readlink($_),
274
                          File::Spec->catfile($newdir, $File::Find::name))) {
275
              chdir($oldcurrdir);
276
              $form->error("$ERRNO: symlink $File::Find::name");
277
            }
278
          } elsif (-f $_) {
279
            if (!copy($_, File::Spec->catfile($newdir, $File::Find::name))) {
280
              chdir($oldcurrdir);
281
              $form->error("$ERRNO: cp $File::Find::name");
282
            }
283
          }
284
        }, "./");
285

  
286
      chdir($oldcurrdir);
287

  
288
    } else {
289
      $form->error("$ERRNO: $user->{templates}");
290
    }
291
  }
292

  
293
  # Add new user to his groups.
294
  if (ref $form->{new_user_group_ids} eq 'ARRAY') {
295
    my $all_groups = $main::auth->read_groups();
296
    my %user       = $main::auth->read_user(login => $myconfig->{login});
297

  
298
    foreach my $group_id (@{ $form->{new_user_group_ids} }) {
299
      my $group = $all_groups->{$group_id};
300

  
301
      next if !$group;
302

  
303
      push @{ $group->{members} }, $user{id};
304
      $main::auth->save_group($group);
305
    }
306
  }
307

  
308
  if ($main::auth->can_change_password()
309
      && defined $::form->{new_password}
310
      && ($::form->{new_password} ne '********')) {
311
    my $verifier = SL::Auth::PasswordPolicy->new;
312
    my $result   = $verifier->verify($::form->{new_password}, 1);
313

  
314
    if ($result != SL::Auth::PasswordPolicy->OK()) {
315
      $form->error($::locale->text('The settings were saved, but the password was not changed.') . ' ' . join(' ', $verifier->errors($result)));
316
    }
317

  
318
    $main::auth->change_password($myconfig->{login}, $::form->{new_password});
319
  }
320

  
321
  $::form->redirect($::locale->text('User saved!'));
322
}
323

  
324
sub save_user_as_new {
325
  my $form       = $main::form;
326

  
327
  $form->{user}{login} = $::form->{new_user_login};
328
  delete $form->{user}{id};
329
  delete @{$form}{qw(id edit new_user_login)};
330

  
331
  save_user();
332
}
333

  
334
sub delete_user {
335
  my $form      = $main::form;
336
  my $locale    = $main::locale;
337

  
338
  my $user = $::form->{user} || {};
339

  
340
  $::form->show_generic_error($::locale->text('Missing user id!')) unless $user->{id};
341

  
342
  my $loaded_user = User->new(id => $user->{id});
343

  
344
  my %members   = $main::auth->read_all_users();
345
  my $templates = $members{$loaded_user->{login}}->{templates};
346

  
347
  $main::auth->delete_user($loaded_user->{login});
348

  
349
  if ($templates) {
350
    my $templates_in_use = 0;
351

  
352
    foreach my $login (keys %members) {
353
      next if $loaded_user->{login} eq $login;
354
      next if $members{$login}->{templates} ne $templates;
355
      $templates_in_use = 1;
356
      last;
357
    }
358

  
359
    if (!$templates_in_use && -d $templates) {
360
      unlink <$templates/*>;
361
      rmdir $templates;
362
    }
363
  }
364

  
365
  $form->redirect($locale->text('User deleted!'));
366

  
367
}
368

  
369 125
sub login_name {
370 126
  my $login = shift;
371 127

  
locale/de/all
75 75
  'Abort'                       => 'Abbrechen',
76 76
  'Abrechnungsnummer'           => 'Abrechnungsnummer',
77 77
  'Abteilung'                   => 'Abteilung',
78
  'Access to clients'           => 'Zugriff auf Mandanten',
78 79
  'Account'                     => 'Konto',
79 80
  'Account Category A'          => 'Aktiva/Mittelverwendung',
80 81
  'Account Category C'          => 'Kosten',
......
116 117
  'Accounting Group saved!'     => 'Buchungsgruppe gespeichert!',
117 118
  'Accounting method'           => 'Versteuerungsart',
118 119
  'Accrual'                     => 'Soll-Versteuerung',
120
  'Actions'                     => 'Aktionen',
119 121
  'Active'                      => 'Aktiv',
120 122
  'Active?'                     => 'Aktiviert?',
121 123
  'Add'                         => 'Erfassen',
......
178 180
  'All Accounts'                => 'Alle Konten',
179 181
  'All Datasets up to date!'    => 'Alle Datenbanken sind auf aktuellem Stand.',
180 182
  'All changes in that file have been reverted.' => 'Alle &Auml;nderungen in dieser Datei wurden r&uuml;ckg&auml;ngig gemacht.',
183
  'All clients'                 => 'Alle Mandanten',
181 184
  'All database upgrades have been applied.' => 'Alle Datenbankupdates wurden eingespielt.',
182 185
  'All general ledger entries'  => 'Alle Hauptbucheinträge',
183 186
  'All groups'                  => 'Alle Gruppen',
......
200 203
  'An invalid character was used (valid characters: #1).' => 'Ein ungültiges Zeichen wurde benutzt (gültige Zeichen: #1).',
201 204
  'An upper-case character is required.' => 'Ein Großbuchstabe ist vorgeschrieben.',
202 205
  'Annotations'                 => 'Anmerkungen',
203
  'Another user with the login #1 does already exist.' => 'Es existiert bereits ein anderer Benutzer mit diesem Login.',
204 206
  'Any stock contents containing a best before date will be impossible to stock out otherwise.' => 'Sonst können Artikel, bei denen ein Mindesthaltbarkeitsdatum gesetzt ist, nicht mehr ausgelagert werden.',
205 207
  'Ap aging on %s'              => 'Offene Verbindlichkeiten zum %s',
206 208
  'Application Error. No Format given' => 'Fehler in der Anwendung. Das Ausgabeformat fehlt.',
......
436 438
  'City'                        => 'Stadt',
437 439
  'Cleared Balance'             => 'abgeschlossen',
438 440
  'Clearing Tax Received (No 71)' => 'Verrechnung des Erstattungsbetrages erwünscht (Zeile 71)',
439
  'Click on login name to edit!' => 'Zum Bearbeiten den Benutzernamen anklicken!',
440 441
  'Client #1'                   => 'Mandant #1',
441 442
  'Client Configuration'        => 'Mandantenkonfiguration',
442 443
  'Client Configuration saved!' => 'Mandantenkonfiguration gespeichert!',
443 444
  'Client list'                 => 'Mandantenliste',
444 445
  'Client name'                 => 'Mandantenname',
446
  'Clients this user has access to' => 'Mandaten, auf die Benutzer Zugriff hat',
445 447
  'Close'                       => 'Übernehmen',
446 448
  'Close Books up to'           => 'Die Bücher abschließen bis zum',
447 449
  'Close Flash'                 => 'Schließen',
......
497 499
  'Create a new department'     => 'Eine neue Abteilung erfassen',
498 500
  'Create a new payment term'   => 'Neue Zahlungsbedingungen anlegen',
499 501
  'Create a new project'        => 'Neues Projekt anlegen',
502
  'Create a new user'           => 'Einen neuen Benutzer anlegen',
500 503
  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
501 504
  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
502 505
  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
......
585 588
  'DUNNING STARTED'             => 'Mahnprozess gestartet',
586 589
  'DUNS-Nr'                     => 'DUNS-Nr.',
587 590
  'Data'                        => 'Daten',
588
  'Database'                    => 'Datenbank',
589 591
  'Database Administration'     => 'Datenbankadministration',
590 592
  'Database Connection Test'    => 'Test der Datenbankverbindung',
591 593
  'Database Host'               => 'Datenbankcomputer',
592 594
  'Database ID'                 => 'Datenbank-ID',
593 595
  'Database User'               => 'Datenbankbenutzer',
594
  'Database User missing!'      => 'Datenbankbenutzer fehlt!',
595 596
  'Database backups and restorations are disabled in the configuration.' => 'Datenbanksicherungen und -wiederherstellungen sind in der Konfiguration deaktiviert.',
596 597
  'Database name'               => 'Datenbankname',
597 598
  'Database settings'           => 'Datenbankeinstellungen',
......
995 996
  'Group saved!'                => 'Warengruppe gespeichert!',
996 997
  'Groups'                      => 'Warengruppen',
997 998
  'Groups that are valid for this client for access rights' => 'Gruppen, die für diesen Mandanten gültig sind',
999
  'Groups this user is a member in' => 'Gruppen, in denen Benutzer Mitglied ist',
998 1000
  'Groups valid for this client' => 'Für Mandanten gültige Gruppen',
999 1001
  'HTML'                        => 'HTML',
1000 1002
  'HTML Templates'              => 'HTML-Vorlagen',
......
1208 1210
  'Lockfile removed!'           => 'System entsperrt!',
1209 1211
  'Login'                       => 'Anmelden',
1210 1212
  'Login Name'                  => 'Benutzer',
1211
  'Login name missing!'         => 'Benutzer - Feld darf nicht leer sein!',
1212 1213
  'Login of User'               => 'Login',
1213 1214
  'Logout'                      => 'Abmelden',
1214 1215
  'Logout now'                  => 'kivitendo jetzt verlassen',
......
1261 1262
  'Missing parameter #1 in call to sub #2.' => 'Fehlender Parameter \'#1\' in Funktionsaufruf \'#2\'.',
1262 1263
  'Missing parameter (at least one of #1) in call to sub #2.' => 'Fehlernder Parameter (mindestens einer aus \'#1\') in Funktionsaufruf \'#2\'.',
1263 1264
  'Missing taxkeys in invoices with taxes.' => 'Fehlende Steuerschl&uuml;ssel in Rechnungen mit Steuern',
1264
  'Missing user id!'            => 'Benutzer ID fehlt!',
1265 1265
  'Mitarbeiter'                 => 'Mitarbeiter',
1266 1266
  'Mixed (requires column "type")' => 'Gemischt (erfordert Spalte "type")',
1267 1267
  'Mobile'                      => 'Mobiltelefon',
......
1289 1289
  'Net amount'                  => 'Nettobetrag',
1290 1290
  'Netto Terms'                 => 'Zahlungsziel netto',
1291 1291
  'New Buchungsgruppe #1'       => 'Neue Buchungsgruppe #1',
1292
  'New Templates'               => 'Erzeuge Vorlagen, Name',
1292
  'New Password'                => 'Neues Passwort',
1293 1293
  'New assembly'                => 'Neues Erzeugnis',
1294 1294
  'New bank account'            => 'Neues Bankkonto',
1295 1295
  'New client #1: The database configuration fields "host", "port", "name" and "user" must not be empty.' => 'Neuer Mandant #1: Die Datenbankkonfigurationsfelder "Host", "Port" und "Name" dürfen nicht leer sein.',
......
1335 1335
  'No file has been uploaded yet.' => 'Es wurde noch keine Datei hochgeladen.',
1336 1336
  'No group has been selected, or the group does not exist anymore.' => 'Es wurde keine Gruppe ausgew&auml;hlt, oder die Gruppe wurde in der Zwischenzeit gel&ouml;scht.',
1337 1337
  'No groups have been added yet.' => 'Es wurden noch keine Gruppen angelegt.',
1338
  'No groups have been created yet.' => 'Es wurden noch keine Gruppen angelegt.',
1338 1339
  'No or an unknown authenticantion module specified in "config/kivitendo.conf".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/kivitendo.conf" angegeben.',
1339 1340
  'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
1340 1341
  'No payment term has been created yet.' => 'Es wurden noch keine Zahlungsbedingungen angelegt.',
......
1806 1807
  'Set eMail text'              => 'eMail Text eingeben',
1807 1808
  'Settings'                    => 'Einstellungen',
1808 1809
  'Setup Menu'                  => 'Menü-Variante',
1809
  'Setup Templates'             => 'Vorlagen auswählen',
1810 1810
  'Ship to'                     => 'Lieferadresse',
1811 1811
  'Ship via'                    => 'Transportmittel',
1812 1812
  'Shipping Address'            => 'Lieferadresse',
......
1975 1975
  'Templates'                   => 'Vorlagen',
1976 1976
  'Terms missing in row '       => '+Tage fehlen in Zeile ',
1977 1977
  'Test and preview'            => 'Test und Vorschau',
1978
  'Test connection'             => 'Verbindung testen',
1979 1978
  'Text field'                  => 'Textfeld',
1980 1979
  'Text field variables: \'WIDTH=w HEIGHT=h\' sets the width and height of the text field. They default to 30 and 5 respectively.' => 'Textfelder: \'WIDTH=w HEIGHT=h\' setzen die Breite und die H&ouml;he des Textfeldes. Wenn nicht anders angegeben, so werden sie 30 Zeichen breit und f&uuml;nf Zeichen hoch dargestellt.',
1981 1980
  'Text variables: \'MAXLENGTH=n\' sets the maximum entry length to \'n\'.' => 'Textzeilen: \'MAXLENGTH=n\' setzt eine Maximall&auml;nge von n Zeichen.',
......
2085 2084
  'The items are imported accoring do their number "X" regardless of the column order inside the file.' => 'Die Einträge werden in der Reihenfolge ihrer Indizes "X" unabhängig von der Spaltenreihenfolge in der Datei importiert.',
2086 2085
  'The link target to add has been created from the existing record.' => 'Das auszuwählende Verknüpfungsziel wurde aus dem bestehenden Beleg erstellt.',
2087 2086
  'The list has been printed.'  => 'Die Liste wurde ausgedruckt.',
2087
  'The login is missing.'       => 'Der Loginname fehlt.',
2088
  'The login is not unique.'    => 'Der Loginname ist nicht eindeutig.',
2088 2089
  'The long description is missing.' => 'Der Langtext fehlt.',
2089 2090
  'The name in row %d has already been used before.' => 'Der Name in Zeile %d wurde vorher bereits benutzt.',
2090 2091
  'The name is missing in row %d.' => 'Der Name fehlt in Zeile %d.',
......
2150 2151
  'The unit in row %d has been used in the meantime and cannot be changed anymore.' => 'Die Einheit in Zeile %d wurde in der Zwischenzeit benutzt und kann nicht mehr ge&auml;ndert werden.',
2151 2152
  'The units have been saved.'  => 'Die Einheiten wurden gespeichert.',
2152 2153
  'The user can chose which client to connect to during login.' => 'Bei der Anmeldung kann der Benutzer auswählen, welchen Mandanten er benutzen möchte.',
2153
  'The user is a member in the following group(s):' => 'Der Benutzer ist Mitglied in den folgenden Gruppen:',
2154
  'The user could not be deleted.' => '',
2155
  'The user has been created.'  => 'Der Benutzer wurde angelegt.',
2156
  'The user has been deleted.'  => '',
2157
  'The user has been saved.'    => 'Der Benutzer wurde gespeichert.',
2154 2158
  'The variable name must only consist of letters, numbers and underscores. It must begin with a letter. Example: send_christmas_present' => 'Der Variablenname darf nur aus Zeichen (keine Umlaute), Ziffern und Unterstrichen bestehen. Er muss mit einem Buchstaben beginnen. Beispiel: weihnachtsgruss_verschicken',
2155 2159
  'The warehouse could not be deleted because it has already been used.' => 'Das Lager konnte nicht gel&ouml;scht werden, da es bereits in Benutzung war.',
2156 2160
  'The warehouse does not contain any bins.' => 'Das Lager enth&auml;lt keine Lagerpl&auml;tze.',
......
2215 2219
  'This update will change the nature the onhand of goods is tracked.' => 'Dieses update &auml;ndert die Art und Weise wie Lagermengen gez&auml;lt werden.',
2216 2220
  'This upgrade script tries to map all existing parts in the database to the newly created Buchungsgruppen.' => 'Dieses Upgradescript versucht, bei allen bestehenden Artikeln neu erstellte Buchungsgruppen zuzuordnen.',
2217 2221
  'This upgrade script tries to map all existing units in the database to the newly created units.' => 'Dieses Update-Script versucht, alle bestehenden Einheiten automatisch in die neuen Einheiten umzuwandeln.',
2222
  'This user is a member in the following groups' => 'Dieser Benutzer ist Mitglied in den folgenden Gruppen',
2223
  'This user will have access to the following clients' => 'Dieser Benutzer wird Zugriff auf die folgenden Mandanten haben',
2218 2224
  'This vendor number is already in use.' => 'Diese Lieferantennummer wird bereits verwendet.',
2219 2225
  'Three Options:'              => 'Drei Optionen:',
2220 2226
  'Time period for the analysis:' => 'Analysezeitraum:',
......
2224 2230
  'To (email)'                  => 'An',
2225 2231
  'To (time)'                   => 'Bis',
2226 2232
  'To Date'                     => 'Bis',
2227
  'To add a user to a group edit a name, change the login name and save.  A new user with the same variables will then be saved under the new login name.' => 'Um einer Gruppe einen neuen Benutzer hinzuzufügen, ändern und speichern Sie am einfachsten einen bestehenden Benutzernamen. Unter dem neuen Namen wird dann ein Benutzer mit denselben Einstellungen angelegt.',
2228 2233
  'To continue please change the taxkey 0 to another value.' => 'Um fortzufahren, ändern Sie bitte den Steuerschlüssel 0 auf einen anderen Wert.',
2234
  'To user login'               => 'Zum Benutzerlogin',
2229 2235
  'Top'                         => 'Oben',
2230 2236
  'Top (CSS)'                   => 'Oben (mit CSS)',
2231 2237
  'Top (Javascript)'            => 'Oben (mit Javascript)',
......
2318 2324
  'Updating the client fields in the database "#1" on host "#2:#3" failed.' => 'Die Aktualisierung der Mandantenfelder in der Datenbank "#1" auf Host "#2:#3" schlug fehl.',
2319 2325
  'Uploaded on #1, size #2 kB'  => 'Am #1 hochgeladen, Größe #2 kB',
2320 2326
  'Use As New'                  => 'Als neu verwenden',
2321
  'Use Templates'               => 'Benutze Vorlagen',
2322 2327
  'Use master default bin for Default Transfer, if no default bin for the part is configured' => 'Standardlagerplatz für Ein- / Auslagern über Standard-Lagerplatz, falls für die Ware kein expliziter Lagerplatz konfiguriert ist',
2323 2328
  'User'                        => 'Benutzer',
2324 2329
  'User Config'                 => 'Einstellungen',
2325
  'User Login'                  => 'Als Benutzer anmelden',
2326 2330
  'User access'                 => 'Benutzerzugriff',
2327
  'User deleted!'               => 'Benutzer gelöscht!',
2328 2331
  'User list'                   => 'Benutzerliste',
2329 2332
  'User login'                  => 'Benutzeranmeldung',
2330 2333
  'User name'                   => 'Benutzername',
2331
  'User saved!'                 => 'Benutzer gespeichert!',
2332 2334
  'Username'                    => 'Benutzername',
2333 2335
  'Users in this group'         => 'BenutzerInnen in dieser Gruppe',
2334 2336
  'Users with access'           => 'Benutzer mit Zugriff',
2335 2337
  'Users with access to this client' => 'Benutzer mit Zugriff auf diesen Mandanten',
2336
  'Ust-IDNr'                    => 'USt-IdNr.',
2337 2338
  'VAT ID'                      => 'UStdID-Nr',
2338 2339
  'Valid'                       => 'Gültig',
2339 2340
  'Valid from'                  => 'Gültig ab',
sql/Pg-upgrade2-auth/foreign_key_constraints_on_delete.sql
1
-- @tag: foreign_key_constraints_on_delete
2
-- @description: Ändert "FOREIGN KEY" constraints auf "ON DELETE CASCADE"
3
-- @depends: clients
4
-- @charset: utf-8
5

  
6
-- auth.clients_groups
7
ALTER TABLE auth.clients_groups DROP CONSTRAINT clients_groups_client_id_fkey;
8
ALTER TABLE auth.clients_groups DROP CONSTRAINT clients_groups_group_id_fkey;
9

  
10
ALTER TABLE auth.clients_groups ADD FOREIGN KEY (client_id) REFERENCES auth.clients (id) ON DELETE CASCADE;
11
ALTER TABLE auth.clients_groups ADD FOREIGN KEY (group_id)  REFERENCES auth."group" (id) ON DELETE CASCADE;
12

  
13
-- auth.clients_users
14
ALTER TABLE auth.clients_users DROP CONSTRAINT clients_users_client_id_fkey;
15
ALTER TABLE auth.clients_users DROP CONSTRAINT clients_users_user_id_fkey;
16

  
17
ALTER TABLE auth.clients_users ADD FOREIGN KEY (client_id) REFERENCES auth.clients (id) ON DELETE CASCADE;
18
ALTER TABLE auth.clients_users ADD FOREIGN KEY (user_id)   REFERENCES auth."user"  (id) ON DELETE CASCADE;
19

  
20
-- auth.group_rights
21
ALTER TABLE auth.group_rights DROP CONSTRAINT group_rights_group_id_fkey;
22

  
23
ALTER TABLE auth.group_rights ADD FOREIGN KEY (group_id) REFERENCES auth."group" (id) ON DELETE CASCADE;
24

  
25
 -- auth.session_content
26
ALTER TABLE auth.session_content DROP CONSTRAINT session_content_session_id_fkey;
27

  
28
ALTER TABLE auth.session_content ADD FOREIGN KEY (session_id) REFERENCES auth.session (id) ON DELETE CASCADE;
29

  
30
 -- auth.user_config
31
ALTER TABLE auth.user_config DROP CONSTRAINT user_config_user_id_fkey;
32

  
33
ALTER TABLE auth.user_config ADD FOREIGN KEY (user_id) REFERENCES auth."user" (id) ON DELETE CASCADE;
34

  
35
-- auth.user_group
36
ALTER TABLE auth.user_group DROP CONSTRAINT user_group_user_id_fkey;
37
ALTER TABLE auth.user_group DROP CONSTRAINT user_group_group_id_fkey;
38

  
39
ALTER TABLE auth.user_group ADD FOREIGN KEY (user_id)  REFERENCES auth."user"  (id) ON DELETE CASCADE;
40
ALTER TABLE auth.user_group ADD FOREIGN KEY (group_id) REFERENCES auth."group" (id) ON DELETE CASCADE;
templates/webpages/admin/backup_dataset.html
82 82

  
83 83
   </table>
84 84

  
85
   <input name="callback" type="hidden" value="controller.pl?action=Admin/list_clients_and_users">
85
   <input name="callback" type="hidden" value="controller.pl?action=Admin/show">
86 86
   <input type="hidden" name="nextsub" value="backup_dataset_start">
87 87

  
88 88
   <hr size="3" noshade>
......
90 90
   <br>
91 91

  
92 92
   <input type="submit" class="submit" name="action" value="[% 'Continue' | $T8 %]">
93
   <a href="controller.pl?action=Admin/list_clients_and_users">[% 'Back' | $T8 %]</a>
93
   <a href="controller.pl?action=Admin/show">[% 'Back' | $T8 %]</a>
94 94

  
95 95
  </form>
96 96

  
templates/webpages/admin/backup_dataset_email_done.html
5 5

  
6 6
 <p>[% LxERP.t8('The dataset backup has been sent via email to #1.', to) | html %]</p>
7 7

  
8
 <p>[% L.link("controller.pl?action=Admin/list_clients_and_users", LxERP.t8("Continue")) %]
8
 <p>[% L.link("controller.pl?action=Admin/show", LxERP.t8("Continue")) %]
templates/webpages/admin/dbadmin.html
3 3
  <h1>[% title %]</h1>
4 4

  
5 5
  <form method="post" action="admin.pl">
6
   <a href="controller.pl?action=Admin/list_clients_and_users">[% 'Back' | $T8 %]</a>
6
   <a href="controller.pl?action=Admin/show">[% 'Back' | $T8 %]</a>
7 7

  
8 8
   <table>
9 9
    <tr>
......
48 48
       </tr>
49 49
      </table>
50 50

  
51
      <input name="callback" type="hidden" value="controller.pl?action=Admin/list_clients_and_users">
51
      <input name="callback" type="hidden" value="controller.pl?action=Admin/show">
52 52

  
53 53
      <br>
54 54
      <input type="submit" class="submit" name="action" value="[% 'Create Dataset' | $T8 %]">
templates/webpages/admin/dbcreate.html
5 5

  
6 6
  <p>[% LxERP.t8('The dataset #1 has been successfully created.', db) | html %]</p>
7 7

  
8
  <p>[% L.link("controller.pl?action=Admin/list_clients_and_users", LxERP.t8("Continue")) %]</p>
8
  <p>[% L.link("controller.pl?action=Admin/show", LxERP.t8("Continue")) %]</p>
templates/webpages/admin/dbdelete.html
5 5

  
6 6
  <p>[% LxERP.t8('The database #1 has been successfully deleted.', db) | html %]</p>
7 7

  
8
  <p>[% L.link("controller.pl?action=Admin/list_clients_and_users", LxERP.t8("Continue")) %]</p>
8
  <p>[% L.link("controller.pl?action=Admin/show", LxERP.t8("Continue")) %]</p>
templates/webpages/admin/dbupgrade_all_done.html
10 10
 <p>[% 'All database upgrades have been applied.' | $T8 %]</p>
11 11
[% END %]
12 12

  
13
<p>[% L.link("controller.pl?action=Admin/list_clients_and_users", LxERP.t8("Continue")) %]</p>
13
<p>[% L.link("controller.pl?action=Admin/show", LxERP.t8("Continue")) %]</p>
templates/webpages/admin/delete_dataset.html
18 18
  <input type="hidden" name="dbpasswd"  value="[% HTML.escape(dbpasswd) %]">
19 19
  <input type="hidden" name="dbdefault" value="[% HTML.escape(dbdefault) %]">
20 20

  
21
  <input name="callback" type="hidden" value="controller.pl?action=Admin/list_clients_and_users">
21
  <input name="callback" type="hidden" value="controller.pl?action=Admin/show">
22 22

  
23 23

  
24 24
  <input type="hidden" name="nextsub" value="dbdelete">
templates/webpages/admin/edit_user.html
1
[%- USE T8 %]
2 1
[%- USE HTML %]
3 2
[%- USE L %][%- USE LxERP -%]
4
 <script type="text/javascript">
5
  <!--
6
      function open_connection_test_window() {
7
        // host name port user passwd
8
        var url = "admin.pl?INPUT_ENCODING=UTF-8&action=test_db_connection&" +
9
          "dbhost="   + encodeURIComponent(get_input_value("user.dbhost"))   + "&" +
10
          "dbport="   + encodeURIComponent(get_input_value("user.dbport"))   + "&" +
11
          "dbname="   + encodeURIComponent(get_input_value("user.dbname"))   + "&" +
12
          "dbuser="   + encodeURIComponent(get_input_value("user.dbuser"))   + "&" +
13
          "dbpasswd=" + encodeURIComponent(get_input_value("user.dbpasswd")) + "&";
14

  
15
        var parm = centerParms(400,300) + ",width=400,height=300,status=yes,scrollbars=yes";
16

  
17
        window.open(url, "_new_generic", parm);
18
      }
19
    -->
20
 </script>
21

  
22
 <h1>[% title %]</h1>
23

  
24
 <form name="Form" id="Form" method="post" action="admin.pl">
25
  <p><a href="admin.pl?action=list_users">[% 'Back' | $T8 %]</a></p>
26

  
27
  <table width="100%">
28
   <tr valign="top">
29
    <td>
30
     <table>
31
      <tr>
32
       <th align="right">[% 'Login Name' | $T8 %]</th>
33
       <td>
34
        [%- IF edit %]
35
         <input type="hidden" id='user.id' name="user.id" value="[% HTML.escape(user.id) %]">[% HTML.escape(user.login) %]
36
        [%- ELSE %]
37
         <input name="user.login" value="[% HTML.escape(user.login) %]">
38
        [%- END %]
39
       </td>
40
      </tr>
41

  
42
      <tr>
43
       <th align="right">[% 'Password' | $T8 %]</th>
44
       <td>[% IF CAN_CHANGE_PASSWORD %]<input type="password" name="new_password" size="8" value="********">[% ELSE %]********[% END %]</td>
45
      </tr>
46

  
47
      <tr>
48
       <th align="right">[% 'Name' | $T8 %]</th>
49
       <td><input name="user.name" size="15" value="[% HTML.escape(user.name) %]"></td>
50
      </tr>
51

  
52
      <tr>
53
       <th align="right">[% 'E-mail' | $T8 %]</th>
54
       <td><input name="user.email" size="30" value="[% HTML.escape(user.email) %]"></td>
55
      </tr>
56

  
57
      <tr valign="top">
58
       <th align="right">[% 'Signature' | $T8 %]</th>
59
       <td><textarea name="user.signature" rows="3" cols="35">[% HTML.escape(user.signature) %]</textarea></td>
60
      </tr>
61

  
62
      <tr>
63
       <th align="right">[% 'Phone' | $T8 %]</th>
64
       <td><input name="user.tel" size="14" value="[% HTML.escape(user.tel) %]"></td>
65
      </tr>
66

  
67
      <tr>
68
       <th align="right">[% 'Fax' | $T8 %]</th>
69
       <td><input name="user.fax" size="14" value="[% HTML.escape(user.fax) %]"></td>
70
      </tr>
71

  
72
      <tr>
73
       <th align="right">[% 'Company' | $T8 %]</th>
74
       <td><input name="user.company" size="35" value="[% HTML.escape(user.company) %]"></td>
75
      </tr>
76

  
77
      <tr valign="top">
78
       <th align="right">[% 'Address' | $T8 %]</th>
79
       <td><textarea name="user.address" rows="4" cols="35">[% HTML.escape(user.address) %]</textarea></td>
80
      </tr>
81

  
82
      <tr valign="top">
83
       <th align="right">[% 'Tax number' | $T8 %]</th>
84
       <td><input name="user.taxnumber" size="14" value="[% HTML.escape(user.taxnumber) %]"></td>
85
      </tr>
86

  
87
      <tr valign="top">
88
       <th align="right">[% 'Ust-IDNr' | $T8 %]</th>
89
       <td><input name="user.co_ustid" size="14" value="[% HTML.escape(user.co_ustid) %]"></td>
90
      </tr>
91

  
92
      <tr valign="top">
93
       <th align="right">[% 'DUNS-Nr' | $T8 %]</th>
94
       <td><input name="user.duns" size="14" value="[% HTML.escape(user.duns) %]"></td>
95
      </tr>
96

  
97
      <tr>
98
       <th align="right">[% 'SEPA creditor ID' | $T8 %]</th>
99
       <td><input name="user.sepa_creditor_id" size="35" maxlength="35" value="[% HTML.escape(user.sepa_creditor_id) %]"></td>
100
      </tr>
101
     </table>
102
    </td>
103

  
104
    <td>
105
     <table>
106
      <tr>
107
       <th align="right">[% 'Date Format' | $T8 %]</th>
108
       <td>[% L.select_tag('user.dateformat', all_dateformats, default = user.dateformat) %]</td>
109
      </tr>
110

  
111
      <tr>
112
       <th align="right">[% 'Number Format' | $T8 %]</th>
113
       <td>[% L.select_tag('user.numberformat', all_numberformats, default = user.numberformat) %]</td>
114
      </tr>
115

  
116
      <tr>
117
       <th align="right">[% 'Dropdown Limit' | $T8 %]</th>
118
       <td><input name="user.vclimit" value="[% HTML.escape(user.vclimit) %]"></td>
119
      </tr>
120

  
121
      <tr>
122
       <th align="right">[% 'Language' | $T8 %]</th>
123
       <td>[% L.select_tag('user.countrycode', all_countrycodes, title_key = 'title', default = user.countrycode) %]</td>
124
      </tr>
125

  
126
      <tr>
127
       <th align="right">[% 'Stylesheet' | $T8 %]</th>
128
       <td>[% L.select_tag('user.stylesheet', all_stylesheets, default = user.stylesheet) %]</td>
129
      </tr>
130

  
131
      <tr>
132
       <th align="right">[% 'Printer' | $T8 %]</th>
133
       <td><input name="user.printer" size="20" value="[% HTML.escape(user.printer) %]"></td>
134
      </tr>
135
      <tr>
136
       <th align="right">[% 'Use Templates' | $T8 %]</th>
137
       <td>[% L.select_tag('usetemplates', all_templates, default = user.templates) %]</td>
138
      </tr>
139
      <tr>
140
       <th align="right">[% 'New Templates' | $T8 %]</th>
141
       <td><input name="newtemplates"></td>
142
      </tr>
143
      <tr>
144
       <th align="right">[% 'Setup Templates' | $T8 %]</th>
145
       <td>[% L.select_tag('mastertemplates', all_master_templates, default = 'Standard') %]</td>
146
      </tr>
147
      <tr>
148
       <th align="right">[% 'Setup Menu' | $T8 %]</th>
149
       <td>[% L.select_tag('user.menustyle', all_menustyles, title_key = 'title', default = user.menustyle) %]</td>
150
      </tr>
151
      <tr>
152
       <th align='right'>[% 'Mandatory Departments' | $T8 %]</th>
153
       <td>
154
        <input type='radio' name='user.mandatory_departments' value='0' [% IF !user.mandatory_departments %] checked[% END %]> [% 'No' | $T8 %]
155
        <input type='radio' name='user.mandatory_departments' value='1' [% IF  user.mandatory_departments %] checked[% END %]> [% 'Yes' | $T8 %]
156
       </td>
157
      </tr>
158

  
159
      <input type="hidden" name="user.templates" value="[% HTML.escape(user.templates) %]">
160
     </table>
161
    </td>
162
   </tr>
163

  
164
   <tr class="listheading">
165
    <th colspan="2">[% 'Database' | $T8 %]</th>
166
   </tr>
167

  
168
   <tr>
169
    <td colspan="2">
170
     <table>
171
      <tr>
172
       <th align="right">[% 'Driver' | $T8 %]</th>
173
       <td>PostgreSQL</td>
174
       <th align="right">[% 'Host' | $T8 %]</th>
175
       <td><input name="user.dbhost" size="30" value="[% HTML.escape(user.dbhost) %]"></td>
176
      </tr>
177

  
178
      <tr>
179
       <th align="right">[% 'Dataset' | $T8 %]</th>
180
       <td><input name="user.dbname" size="15" value="[% HTML.escape(user.dbname) %]"></td>
181
       <th align="right">[% 'Port' | $T8 %]</th>
182
       <td><input name="user.dbport" size="4" value="[% HTML.escape(user.dbport) %]"></td>
183
      </tr>
184

  
185
      <tr>
186
       <th align="right">[% 'Database User' | $T8 %]</th>
187
       <td><input name="user.dbuser" size="15" value="[% HTML.escape(user.dbuser) %]"></td>
188
       <th align="right">[% 'Password' | $T8 %]</th>
189
       <td><input name="user.dbpasswd" type="password" size="10" value="[% HTML.escape(user.dbpasswd) %]"></td>
190
      </tr>
191

  
192
      <tr>
193
       <td colspan="2"><input type="button" class="submit" onclick="open_connection_test_window();" value="[% 'Test connection' | $T8 %]"></td>
194
      </tr>
195
     </table>
196
    </td>
197
   </tr>
198

  
199
   [% IF edit %]
200
   <tr><td colspan="2"><hr size="3" noshade></td></tr>
201

  
202
   <tr class="listheading">
203
    <th colspan="2">[% 'Group membership' | $T8 %]</th>
204
   </tr>
205

  
206
   <tr>
207
    <td colspan="2">[% 'The user is a member in the following group(s):' | $T8 %]</td>
208
   </tr>
209

  
210
   <tr>
211
    <td colspan="2">[% FOREACH row = GROUPS %]<a href="admin.pl?action=edit_group&group_id=[% HTML.url(row.id) %]">[% HTML.escape(row.name) %]</a>
212
     [% UNLESS loop.last %] | [% END %][% END %]</td>
213
   </tr>
214
   [% END %]
215

  
216
   <tr><td colspan="2"><hr size="3" noshade></td></tr>
217

  
218
  </table>
219

  
220
  <input name="callback" type="hidden" value="admin.pl?action=list_users">
221

  
222
  <a href="admin.pl?action=list_users">[% 'Back' | $T8 %]</a>
223
  <input type="hidden" name="action" value="dispatcher">
224
  <input type="submit" class="submit" name="action_save_user" value="[% 'Save' | $T8 %]">
225

  
226
  [% IF edit %]
227
   [% FOREACH row = GROUPS %]
228
    <input type="hidden" name="new_user_group_ids[]" value="[% HTML.escape(row.id) %]">
229
   [% END %]
230
   <input type="hidden" name="new_user_login" id="new_user_login" value="">
231
   <input type="hidden" name="action_save_user_as_new" id="action_save_user_as_new" value="">
232
   <input type="button" class="submit" id="save_as_new_button" value="[% 'Save as new' | $T8 %]">
233
   [% L.submit_tag("action_delete_user", LxERP.t8('Delete'), confirm=LxERP.t8('Are you sure?')) %]
234
   <input type="hidden" name="edit" value="1">
235
  [% END %]
236

  
237
 </form>
238

  
239
 <script type="text/javascript">
240
  <!--
241
    $(document).ready(function() {
242
      $("#save_as_new_button").click(function() {
243
        var new_user_login = prompt('[% 'Please enter the login for the new user.' | $T8 %]', '');
244
        if (!new_user_login || (new_user_login == ''))
245
          return;
246

  
247
        $("#action_save_user_as_new").val('1');
248
        $("#new_user_login").val(new_user_login);
249
        $("#user_id").val('');
250
        $("#Form").submit();
251
      });
252
    });
253
    -->
254
 </script>
3

  
4
[%- INCLUDE 'common/flash.html' %]
5

  
6
<h1>[% title %]</h1>
7

  
8
<p>[% L.link(SELF.url_for(action="show"), LxERP.t8("Back")) %]</p>
9

  
10
<form method="post" action="controller.pl" id="form">
11
 [% L.hidden_tag("user.id", SELF.user.id) %]
12
 [% L.hidden_tag("action", "") %]
13
 [%- SET props=SELF.user.config_values %]
14

  
15
 <h2>[%- LxERP.t8("Settings") %]</h2>
16

  
17
 <table>
18
  <tr valign="top">
19
   <td>
20
    <table>
21
     <tr>
22
      <th align="right">[% LxERP.t8('Login Name') %]</th>
23
      <td>[% L.input_tag("user.login", SELF.user.login) %]</td>
24
     </tr>
25

  
26
     [%- IF AUTH.can_change_password %]
27
     <tr>
28
      <th align="right">[% LxERP.t8("New Password") %]</th>
29
      <td>[% L.input_tag("new_password", "", type="password") %]</td>
30
     </tr>
31
     [%- END %]
32

  
33
     <tr>
34
      <th align="right">[% LxERP.t8("Name") %]</th>
35
      <td>[% L.input_tag("user.config_values.name", props.name) %]</td>
36
     </tr>
37

  
38
     <tr>
39
      <th align="right">[% LxERP.t8('E-mail') %]</th>
40
      <td>[% L.input_tag("user.config_values.email", props.email) %]</td>
41
     </tr>
42

  
43
     <tr valign="top">
44
      <th align="right">[% LxERP.t8('Signature') %]</th>
45
      <td>[% L.textarea_tag("user.config_values.signature", props.signature, rows=3, cols=35) %]</td>
46
     </tr>
47

  
48
     <tr>
49
      <th align="right">[% LxERP.t8('Phone') %]</th>
50
      <td>[% L.input_tag("user.config_values.tel", props.tel) %]</td>
51
     </tr>
52

  
53
     <tr>
54
      <th align="right">[% LxERP.t8('Fax') %]</th>
55
      <td>[% L.input_tag("user.config_values.fax", props.fax) %]</td>
56
     </tr>
57
    </table>
58
   </td>
59

  
60
   <td>
61
    <table>
62
     <tr>
63
      <th align="right">[% LxERP.t8("Date Format") %]</th>
64
      <td>[% L.select_tag("user.config_values.dateformat", SELF.all_dateformats, default=props.dateformat) %]</td>
65
     </tr>
66

  
67
     <tr>
68
      <th align="right">[% LxERP.t8("Number Format") %]</th>
69
      <td>[% L.select_tag("user.config_values.numberformat", SELF.all_numberformats, default=props.numberformat) %]</td>
70
     </tr>
71

  
72
     <tr>
73
      <th align="right">[% LxERP.t8("Dropdown Limit") %]</th>
74
      <td>[% L.input_tag("user.config_values.vclimit", props.vclimit) %]</td>
75
     </tr>
76

  
77
     <tr>
78
      <th align="right">[% LxERP.t8("Language") %]</th>
79
      <td>[% L.select_tag("user.config_values.countrycode", SELF.all_countrycodes, title_key="title", default=props.countrycode) %]</td>
80
     </tr>
81

  
82
     <tr>
83
      <th align="right">[% LxERP.t8("Stylesheet") %]</th>
84
      <td>[% L.select_tag("user.config_values.stylesheet", SELF.all_stylesheets, default=props.stylesheet) %]</td>
85
     </tr>
86

  
87
     <tr>
88
      <th align="right">[% LxERP.t8("Setup Menu") %]</th>
89
      <td>[% L.select_tag("user.config_values.menustyle", SELF.all_menustyles, title_key="title", default=props.menustyle) %]</td>
90
     </tr>
91

  
92
     <tr>
93
      <th align="right">[% LxERP.t8("Mandatory Departments") %]</th>
94
      <td>
95
       [% L.radio_button_tag('user.config_values.mandatory_departments', value='0', id='user.config_values.mandatory_departments_0', label=LxERP.t8('No'),  checked=!props.mandatory_departments) %]
96
       [% L.radio_button_tag('user.config_values.mandatory_departments', value='1', id='user.config_values.mandatory_departments_1', label=LxERP.t8('Yes'), checked= props.mandatory_departments) %]
97
      </td>
98
     </tr>
99
    </table>
100
   </td>
101
  </tr>
102
 </table>
103

  
104
 <h2>[%- LxERP.t8("Access to clients") %]</h2>
105

  
106
[% IF SELF.all_clients.size %]
107
 <p>
108
  [%- LxERP.t8("This user will have access to the following clients") %]:
109
 </p>
110

  
111
 <div class="clearfix">
112
  [% L.select_tag("user.clients[]", SELF.all_clients, id="user_clients", title_key="name", default=SELF.user.clients, default_key='id', multiple=1) %]
113
  [% L.multiselect2side("user_clients", labelsx => LxERP.t8("All clients"), labeldx => LxERP.t8("Clients this user has access to")) %]
114
 </div>
115

  
116
[%- ELSE %]
117
 <p>
118
  [% LxERP.t8("No clients have been created yet.") %]
119
 </p>
120
[%- END %]
121

  
122
 <h2>[%- LxERP.t8("Group membership") %]</h2>
123

  
124
[% IF SELF.all_groups.size %]
125
 <p>
126
  [%- LxERP.t8("This user is a member in the following groups") %]:
127
 </p>
128

  
129
 <div class="clearfix">
130
  [% L.select_tag("user.groups[]", SELF.all_groups, id="user_groups", title_key="name", default=SELF.user.groups, default_key='id', multiple=1) %]
131
  [% L.multiselect2side("user_groups", labelsx => LxERP.t8("All groups"), labeldx => LxERP.t8("Groups this user is a member in")) %]
132
 </div>
133

  
134
[%- ELSE %]
135
 <p>
136
  [% LxERP.t8("No groups have been created yet.") %]
137
 </p>
138
[%- END %]
139

  
140
<hr size="3" noshade>
141

  
142
<p>
143
 [% L.link(SELF.url_for(action="show"), LxERP.t8("Back")) %]
144

  
145
 [% L.button_tag("submit_with_action('save_user')", LxERP.t8("Save")) %]
146
 [% IF SELF.user.id %]
147
  [% L.button_tag("save_as_new()", LxERP.t8("Save as new")) %]
148
  [% L.button_tag("submit_with_action('delete_user')", LxERP.t8("Delete"), confirm=LxERP.t8("Are you sure?")) %]
149
 [%- END %]
150
</p>
151

  
152
</form>
153

  
154
<script type="text/javascript">
155
 <!--
156
  function submit_with_action(action) {
157
    $("#action").val("Admin/" + action);
158
    $("#form").submit();
159
  }
160

  
161
  function save_as_new() {
162
    var new_user_login = prompt("[% LxERP.t8("Please enter the login for the new user.") %]", "");
163
    if (!new_user_login)
164
      return;
165

  
166
    $("#user_login").val(new_user_login);
167
    $("#user_id").val("");
168
    submit_with_action("save_user");
169
  }
170
   -->
171
</script>
templates/webpages/admin/list_users.html
1
[%- USE T8 %]
2
[%- USE HTML %][%- USE LxERP -%][%- USE L -%]
3
 <h1>[% title %]</h1>
4

  
5
 <form method="post" action="admin.pl">
6

  
7
  <div class="tabwidget">
8
   <ul>
9
    <li><a href="#client_list">[%- LxERP.t8("Client list") %]</a></li>
10
    <li><a href="#user_list">[%- LxERP.t8("User list") %]</a></li>
11
   </ul>
12

  
13
   <div id="client_list">
14
[%- IF !CLIENTS.size %]
15
    <p>
16
     [% LxERP.t8("No clients have been created yet.") %]
17
     [% LxERP.t8("In order to use kivitendo you have to create at least one client, one user, and grant that user access to the client.") %]
18
    </p>
19

  
20
[%- ELSE %]
21
    <table width="100%">
22
     <tr>
23
      <th class="listtop">[% 'Client name' | $T8 %]</th>
24
      <th class="listtop">[% 'Database ID' | $T8 %]</th>
25
      <th class="listtop">[% 'Database name' | $T8 %]</th>
26
      <th class="listtop">[% 'Database Host' | $T8 %]</th>
27
      <th class="listtop">[% 'Database User' | $T8 %]</th>
28
     </tr>
29

  
30
 [%- FOREACH client = CLIENTS %]
31
     <tr class="listrow">
32
      <td><a href="admin.pl?action=edit_client&client.id=[% HTML.url(client.id) %]">[% HTML.escape(client.name) %]</a></td>
33
      <td>[% HTML.escape(client.id) %]</td>
34
      <td>[% HTML.escape(client.dbname) %]</td>
35
      <td>[% HTML.escape(client.dbhost) %][% IF client.dbport %]:[%- HTML.escape(client.dbport) %][%- END %]</td>
36
      <td>[% HTML.escape(client.dbuser) %]</td>
37
     </tr>
38
 [%- END %]
39
    </table>
40
[%- END %]
41
   </div>
42

  
43
   <div id="user_list">
44
[%- IF !USERS.size %]
45
    <p>
46
     [% LxERP.t8("No users have been created yet.") %]
47
     [% LxERP.t8("In order to use kivitendo you have to create at least one client, one user, and grant that user access to the client.") %]
48
    </p>
49

  
50
[%- ELSE %]
51
    <table width="100%">
52
     <tr>
53
      <th class="listtop">[% 'Login Name' | $T8 %]</th>
54
      <th class="listtop">[% 'Name' | $T8 %]</th>
55
      <th class="listtop">[% 'Language' | $T8 %]</th>
56
     </tr>
57

  
58
 [% FOREACH user = USERS %]
59
  [%- SET config = user.config_values %]
60
     <tr class="listrow">
61
      <td><a href="admin.pl?action=edit&user.id=[% HTML.url(user.id) %]">[% HTML.escape(user.login) %]</a></td>
62
      <td>[% HTML.escape(config.name) %]</td>
63
      <td>[% HTML.escape(config.countrycode) %]</td>
64
     </tr>
65
 [% END %]
66
    </table>
67
[%- END %]
68
   </div>
69
  </div>
70

  
71
  [% L.link(SELF.url_for(action="add_client"), LxERP.t8("Add Client")) %]
72
  <span class="link_separator">|</span>
73
  [% L.link(SELF.url_for(action="add_user"), LxERP.t8("Add User")) %]
74
  <span class="link_separator">|</span>
75
  [% L.link(SELF.url_for(action="edit_groups"), LxERP.t8("Edit groups")) %]
76
  <span class="link_separator">|</span>
77
  [% L.link(SELF.url_for(action="pg_database_administration", controller="admin.pl"), LxERP.t8("Pg Database Administration")) %]
78
  <span class="link_separator">|</span>
79
  [% L.link(SELF.url_for(action="printer_management", controller="admin.pl"), LxERP.t8("Printer Management")) %]
80
  <span class="link_separator">|</span>
81
  [% IF LOCKED %]
82
   [% L.link(SELF.url_for(action="unlock_system"), LxERP.t8("Unlock System")) %]
83
  [% ELSE %]
84
   [% L.link(SELF.url_for(action="lock_system"), LxERP.t8("Lock System")) %]
85
  [% END %]
86
  <span class="link_separator">|</span>
87
  [% L.link(SELF.url_for(action="logout"), LxERP.t8("Logout")) %]
88

  
89
  <div style="background-color: #FFFFDA; font-size: 12px; padding: 0.5em; max-width: 720px; margin: 1em;">
90
  <p>[% 'Click on login name to edit!' | $T8 %]</p>
91
  <p>[% 'To add a user to a group edit a name, change the login name and save.  A new user with the same variables will then be saved under the new login name.' | $T8 %]</p>
92
  </div>
93
 </form>
94

  
95
 <hr>
96

  
97
 <h2>[% 'User Login' | $T8 %]</h2>
98

  
99
 <form method="post" action="controller.pl">
100
  <input type="hidden" name="action" value="LoginScreen/login">
101

  
102
  <table border="0">
103
   <tr>
104
    <th align="right">[% 'Login Name' | $T8 %]</th>
105
    <td><input class="login" name="{AUTH}login"></td>
106
    <td>&nbsp;</td>
107
   </tr>
108
   <tr>
109
    <th align="right">[% 'Password' | $T8 %]</th>
110
    <td><input class="login" type="password" name="{AUTH}password"></td>
111
    <td><input type="submit" value="[% 'Login' | $T8 %]"></td>
112
   </tr>
113
  </table>
114

  
115
 </form>
templates/webpages/admin/restore_dataset_start_footer.html
10 10
 </p>
11 11

  
12 12
 <p>
13
  [% L.link("controller.pl?action=Admin/list_clients_and_users", LxERP.t8("Continue")) %]
13
  [% L.link("controller.pl?action=Admin/show", LxERP.t8("Continue")) %]
14 14
 </p>
templates/webpages/admin/show.html
1
[%- USE HTML %][%- USE LxERP -%][%- USE L -%]
2

  
3
[% INCLUDE 'common/flash.html' %]
4

  
5
<h1>[% title %]</h1>
6

  
7
<div>
8
 [% LxERP.t8("Actions") %]:
9
 <span class="link_separator"></span>
10
 [% L.link(SELF.url_for(action="new_client"), LxERP.t8("Add Client")) %]
11
 <span class="link_separator">|</span>
12
 [% L.link(SELF.url_for(action="new_user"), LxERP.t8("Add User")) %]
13
 <span class="link_separator">|</span>
14
 [% L.link(SELF.url_for(action="edit_groups"), LxERP.t8("Edit groups")) %]
15
 <span class="link_separator">|</span>
16
 [% L.link(SELF.url_for(action="pg_database_administration", controller="admin.pl"), LxERP.t8("Pg Database Administration")) %]
17
 <span class="link_separator">|</span>
18
 [% L.link(SELF.url_for(action="printer_management", controller="admin.pl"), LxERP.t8("Printer Management")) %]
19
 <span class="link_separator">|</span>
20
 [% IF LOCKED %]
21
  [% L.link(SELF.url_for(action="unlock_system"), LxERP.t8("Unlock System")) %]
22
 [% ELSE %]
23
  [% L.link(SELF.url_for(action="lock_system"), LxERP.t8("Lock System")) %]
24
 [% END %]
25
 <span class="link_separator">|</span>
26
 [% L.link(SELF.url_for(action="logout"), LxERP.t8("Logout")) %]
27
 <span class="link_separator">|</span>
28
 [% L.link(SELF.url_for(controller="LoginScreen", action="user_login"), LxERP.t8("To user login")) %]
29
</div>
30

  
31
<hr>
32

  
33
<div class="tabwidget">
34
 <ul>
35
  <li><a href="#user_list">[%- LxERP.t8("User list") %]</a></li>
36
  <li><a href="#client_list">[%- LxERP.t8("Client list") %]</a></li>
37
 </ul>
38

  
39
 <div id="user_list">
40
[%- IF !USERS.size %]
41
  <p>
42
   [% LxERP.t8("No users have been created yet.") %]
43
   [% LxERP.t8("In order to use kivitendo you have to create at least one client, one user, and grant that user access to the client.") %]
44
  </p>
45

  
46
[%- ELSE %]
47
  <table width="100%">
48
   <tr>
49
    <th class="listtop">[% LxERP.t8('Login Name') %]</th>
50
    <th class="listtop">[% LxERP.t8('Name') %]</th>
51
    <th class="listtop">[% LxERP.t8('Language') %]</th>
52
   </tr>
53

  
54
[% FOREACH user = USERS %]
55
[%- SET config = user.config_values %]
56
   <tr class="listrow">
57
    <td>[% L.link(SELF.url_for(action="edit_user", id=user.id), HTML.escape(user.login)) %]</td>
58
    <td>[% HTML.escape(config.name) %]</td>
59
    <td>[% HTML.escape(config.countrycode) %]</td>
60
   </tr>
61
[% END %]
62
  </table>
63
[%- END %]
64
 </div>
65

  
66
 <div id="client_list">
67
[%- IF !CLIENTS.size %]
68
  <p>
69
   [% LxERP.t8("No clients have been created yet.") %]
70
   [% LxERP.t8("In order to use kivitendo you have to create at least one client, one user, and grant that user access to the client.") %]
71
  </p>
72

  
73
[%- ELSE %]
74
  <table width="100%">
75
   <tr>
... Dieser Diff wurde abgeschnitten, weil er die maximale Anzahl anzuzeigender Zeilen überschreitet.

Auch abrufbar als: Unified diff