All pastes #751396 Raw Edit

Unbenannt

public text v1 · immutable
#751396 ·published 2007-10-27 10:54 UTC
rendered paste body
package III::Controller::Users;

use strict;
use warnings;
use base 'Catalyst::Controller';
use Email::Valid;

=head1 NAME

III::Controller::Users - Catalyst Controller

=head1 DESCRIPTION

Catalyst Controller.

=head1 METHODS

=cut

=head2 index 

=cut

sub index : Private {

    my ( $self, $c ) = @_;

    my $role_id = $c->model('III::role')->search(
        {
            state => [qw/offline online/],
            level => { "<=", $c->user->obj->level },
        },
        { order_by => 'level DESC' }
    )->first->id;

    $c->response->redirect( $c->uri_for( $role_id, 'list' ) );
}

=item 

    Beschreibung : Aufbau des Menübaums zur Auswahl der Gruupen
    Rückgabe     : Teiltemplate der Gruppenauswahl

=cut

sub users : PathPart('users') Chained('/') CaptureArgs(1) {

    my ( $self, $c, $role_id ) = @_;

    # Für das Template
    $c->stash->{current_role_id} = $role_id;

    # Liste der Rollen nach Level
    $c->stash->{roles} = [
        $c->model('III::role')->search(
            {
                state => [qw/offline online/],
                level => { "<=", $c->user->obj->level },
            },

            { order_by => 'level DESC' }
          )->all
    ];
    $c->stash->{tree} = 'users/tree.tt2';

    # Den aktuellen Rolle direkt auslesen
    $c->stash->{role} = $c->model('III::role')->find($role_id);
}

=head2 list

Liste der Benutzer anzeigen

=cut

sub list : PathPart('list') Chained('users') {

    my ( $self, $c, $alpha ) = @_;

    my $role_id = $c->stash->{current_role_id};

    my $structuralunits = [ $c->user->obj->allstructuralunitsids ];

    my $user_count = $c->model('III::user')->search(

        {
            'me.state'                                       => [qw/offline online/],
            'role.role_id'                                   => $role_id,
            'function_has_structuralunits.structuralunit_id' => { -in => $structuralunits },
        },
        {
            order_by => 'me.lastname',
            join     => { 'functions' => [ 'role', 'function_has_structuralunits' ] },
        }
    )->count;

    if ( $user_count > 25 ) {

        my @alpha = $c->model('III::user')->search(
            {
                'me.state'                                       => [qw/offline online/],
                'role.role_id'                                   => $role_id,
                'function_has_structuralunits.structuralunit_id' => { -in => $structuralunits },

            },
            {
                join => { 'functions' => [ 'role', 'function_has_structuralunits' ] },

                +select  => [ \'SUBSTR(LTRIM(lastname),1,1) AS alpha' ],
                +as      => 'alpha',
                group_by => 'alpha',
                order_by => 'alpha',
            }
        )->all;

        $alpha ||= $alpha[0]->get_column('alpha');

        $c->stash->{alphas} = [ map { $_->get_column('alpha') } @alpha ];
        $c->stash->{current_alpha} = $alpha;

        # Liste der Benutzer, der dem Benutzer zugeteilten
        $c->stash->{list} = [
            $c->model('III::user')->search(

                {
                    'lastname'                                       => { like => $alpha . "%" },
                    'me.state'                                       => [qw/offline online/],
                    'role.role_id'                                   => $role_id,
                    'function_has_structuralunits.structuralunit_id' => { -in  => $structuralunits },
                },
                {
                    order_by => 'me.lastname',
                    join     => { 'functions' => [ 'role', 'function_has_structuralunits' ] },
                    prefetch => { 'functions' => [ 'role', { 'function_has_structuralunits' => 'structuralunit' } ] },
                }
              )->all
        ];

    } else {

        # Liste der Benutzer, der dem Benutzer zugeteilten
        $c->stash->{list} = [
            $c->model('III::user')->search(

                {
                    'me.state'                                       => [qw/offline online/],
                    'role.role_id'                                   => $role_id,
                    'function_has_structuralunits.structuralunit_id' => { -in => $structuralunits },
                },
                {
                    order_by => 'me.lastname',
                    join     => { 'functions' => [ 'role', 'function_has_structuralunits' ] },
                    prefetch => { 'functions' => [ 'role', { 'function_has_structuralunits' => 'structuralunit' } ] },
                }
              )->all
        ];

    }

    # Template auswählen
    $c->stash->{template} = 'users/list.tt2';
}

=head2 edit

    Beschreibung: Benutzer bearbeiten
    
=cut

sub edit : PathPart('edit') Chained('users') Args(1) {

    my ( $self, $c, $id ) = @_;
    $c->stash->{user}     = $c->model('III::user')->find($id);
    $c->stash->{template} = 'users/edit.tt2';
}

=head2 view

    Beschreibung: Benutzer anschauen
    
=cut

sub view : PathPart('view') Chained('users') Args(1) {

    my ( $self, $c, $id ) = @_;

    my $role_id = $c->stash->{current_role_id};

    my $structuralunits = [ $c->user->obj->allstructuralunitsids ];

    my $user = $c->model('III::user')->search(
        {
            'me.user_id'                                     => $id,
            'role.role_id'                                   => $role_id,
            'function_has_structuralunits.structuralunit_id' => { -in => $structuralunits }
        },
        { join => { functions => [ 'role', 'function_has_structuralunits' ] } }

    )->first;

    if ($user) {

        $c->stash->{user}     = $c->model('III::user')->find($id);
        $c->stash->{template} = 'users/view.tt2';

    } else {

        $c->forward('/failed');

    }
}

=head2 create

    Beschreibung : Einen neuen Benutzer anlegen
    Rückgabe     : Formular für das neuanlegen

=cut

sub create : PathPart('create') Chained('users') {

    my ( $self, $c ) = @_;

    if ( $c->flash->{noclean} ) {

        # Funktionen für die Anzeige aufbereiten
        foreach my $role_id ( keys %{ $c->session->{functions} } ) {

            my $structuralunits_ids = $c->session->{functions}{$role_id};
            my $structuralunits     = $c->model('III::structuralunit')->search( { structuralunit_id => { -in => $structuralunits_ids } } );
            my $role                = $c->model('III::role')->find($role_id);

            if ( $role && $structuralunits->count ) {
                push @{ $c->stash->{selected_functions} }, { role => $role->name, id => $role->id, structuralunits => [ $structuralunits->get_column('name')->all ] };
            }
        }

    } else {

        # Funktion zurücksetzen
        delete $c->session->{functions};
    }

    $c->stash->{template} = 'users/create.tt2';
}

=head2 docreate

Übergebene Daten speichern

=cut

sub docreate : PathPart('docreate') Chained('users') Args(0) {

    my ( $self, $c ) = @_;

    my $role = $c->stash->{role};

    # Retrieve the values from the form
    my $username  = $c->request->params->{username};
    my $firstname = $c->request->params->{firstname};
    my $lastname  = $c->request->params->{lastname};
    my $email     = $c->request->params->{email};
    my $idmdv     = $c->request->params->{idmdv};
    my $state     = $c->request->params->{state};

    # Eingabe-Datenvalidierung
    my $emailvalid = Email::Valid->address($email);
    my $userexist = $c->model('III::user')->search( { username => $username } )->count;

    $c->flash->{error}{firstname} = "Bitte geben Sie einen Nachnamen an"                               if ( !$lastname );
    $c->flash->{error}{firstname} = "Bitte geben Sie einen Vornamen an"                                if ( !$firstname );
    $c->flash->{error}{username}  = "Bitte geben Sie einen Benutzernamen an"                           if ( !$username );
    $c->flash->{error}{email}     = "Bitte geben Sie einen E-Mailadresse an"                           if ( !$email );
    $c->flash->{error}{email}     = 'Bitte geben Sie die E-Mailadresse im Format user@domain.tld an'   if ( !$emailvalid );
    $c->flash->{error}{username}  = 'Benutzername ist schon vergeben'                                  if ($userexist);
    $c->flash->{error}{username}  = "Bitte geben Sie ein mindestens 5 Zeichen langen Benutzernamen an" if ( length($username) > 0 && length($username) < 5 );
    $c->flash->{error}{username}  = "Bitte geben Sie ein maximal 35 Zeichen langen Benutzernamen an"   if ( length($username) > 0 && length($username) > 35 );
    $c->flash->{error}{functions} = "Bitte ordnen Sie mindestens eine Funktion zu."                    if ( keys %{ $c->session->{functions} } == 0 );

    if ( keys %{ $c->flash->{error} } == 0 ) {

        # Benutzer anlegen
        my $user = $c->model('III::user')->create(
            {
                username  => $username,
                firstname => $firstname,
                lastname  => $lastname,
                email     => $email,
                idmdv     => $idmdv,
                state     => ( $state ? 'online' : 'offline' ),
            }
        );

        # zufälliges Password erzeugen
        my $password = $user->setrandompassword;
        $user->update;

        $c->stash->{admin}    = $c->user->obj;
        $c->stash->{user}     = $user;
        $c->stash->{password} = $password;

        # Funktionen zuordnen
        foreach my $role_id ( keys %{ $c->session->{functions} } ) {

            my $structuralunits_ids = $c->session->{functions}{$role_id};
            my $structuralunits = $c->model('III::structuralunit')->search( { structuralunit_id => { -in => $structuralunits_ids } } );
            $role = $c->model('III::role')->find($role_id);

            if ( $role && $structuralunits->count ) {

                my $function = $user->add_to_functions( { role_id => $role->id } );

                foreach my $structuralunit ( $structuralunits->all ) {

                    $function->add_to_function_has_structuralunits( { structuralunit_id => $structuralunit->id } );
                }
            }

        }

        # Liste der anzulegenden Funktion löschen
        delete $c->session->{functions};

        $c->email(
            header => [
                From    => $c->user->mailaddress,
                To      => $user->mailaddress,
                Subject => 'Zugangsdaten ESRA3',
            ],
            template => 'users/welcome_mail.tt2',
        );

        # Weiterleitungen zur Übersichtsliste
        $c->response->redirect( $c->uri_for( '/users', $role->id, 'list' ) );

    } else {

        $c->flash->{error_msg} = "Bitte füllen Sie die markierten Felder korrekt aus";

        # Werte sichern
        foreach my $field (qw/username firstname lastname  idmdv state/) {
            $c->flash->{$field} = $c->request->params->{$field};
        }

        $c->flash->{email} = $emailvalid || $email;
        $c->flash->{noclean} = 1;

        # Zurück
        $c->response->redirect( $c->request->referer );
    }
}

=head2 update 

    Beschreibung : Benutzerdaten speichern
    Parameter    : die 
    Rückgabe     : Je nach auswahl zurück zur Maske oder zur Liste weiterleiten

=cut

sub update : PathPart('update') Chained('users') Args(1) {

    my ( $self, $c, $user_id ) = @_;

    # Rolle aus dem Stash
    my $role = $c->stash->{role};

    # Aktuellen Benutzer auslesen
    my $user = $c->model('III::user')->find($user_id);

    # Felder updaten
    foreach my $field (qw/username firstname lastname email idmdv/) {

        $user->$field( $c->request->params->{$field} );
    }

    # Password-Verwaltung - Kennwort als MD5 ablegen
    my $password = $c->request->param('password');
    $user->setpassword($password);

    # Sonderbehandlung / Status-Feld
    my $state = $c->request->params->{state};

    if ($state) {

        $user->state('online');

    } elsif ( !$state && $user->state eq 'online' ) {

        $user->state('offline');
    }

    # Nur wenn Änderungen vorhanden sind
    if ( $user->is_changed ) {

        $c->flash->{status_msg} = "Änderungen wurden gespeichert";

        # Update ausführen
        $user->update;

    } else {

        # Es wurde nichts geändert
        $c->flash->{status_msg} = "Es wurden keine Änderungen vorgenommen";
    }

    # Weiterleitung je nach Auswahl
    if ( $c->req->params->{saveandback} ) {

        $c->response->redirect( $c->uri_for( '/users', $role->id, 'list' ) );

    } else {

        $c->response->redirect( $c->request->referer );

    }
}

=head2 delete 

Einen Benutzer löschen

=cut

sub delete : PathPart('delete') Chained('users') Args(1) {

    my ( $self, $c, $user_id ) = @_;

    # Rolle aus dem Stash
    my $role = $c->stash->{role};

    # TODO rechte prüfen

    # Benutzer suchen
    my $user = $c->model('III::user')->find($user_id);

    # Wenn ein benutzer gefunden wurde
    if ($user) {
        $user->state('deleted');
        $user->update;
    }

    # Use 'flash' to save information across requests util it's read
    $c->flash->{status_msg} = "Benutzer " . $user->name . " gelöscht";

    # Redirect the user back to the list page with status msg as an arg
    $c->response->redirect( $c->uri_for( '/users', $role->id, 'list' ) );
}

=head1 AUTHOR

Jens Gassmann <gassmann@angel.de>

=head1 LICENSE


=cut

1;