#!%TCLSH%

#
# Script pour modifier un groupe
#
# Appel par : script grpmodif ou grptraitemodif
#
# Paramtres (formulaire ou URL) :
#	- valider : "Slectionner", "Enregistrer", ">>" ou "<<"
# - si valider == "Slectionner" ou "Rinitialiser"
#	- groupe : nom du groupe slectionn
# - si valider == "Enregistrer"
#	- groupe : nom du groupe en cours de modification
#	- descr : description du groupe modifie ventuellement
#	- vraismembres : membres issus de la slection,  enregistrer
#	- utilisateurs : non utilis
#	- membres : non utilis
# - si valider == ">>"
#	- groupe : nom du groupe en cours de modification
#	- descr : description du groupe modifie ventuellement
#	- vraismembres : membres dj prsents ou slectionns
#	- utilisateurs : utilisateurs  ajouter au groupe (i.e. vraimembres)
#	- membres : non utilis
# - si valider == "<<"
#	- groupe : nom du groupe en cours de modification
#	- descr : description du groupe modifie ventuellement
#	- vraismembres : membres dj prsents ou slectionns
#	- utilisateurs : non utilis
#	- membres : utilisateurs  enlever du groupe (i.e. vraimembres)
#
# Historique
#   2003/06/03 : pda/jean : cration
#   2003/06/27 : pda      : utilisation de cgi-exec
#   2007/12/04 : pda/jean : intgration dans webdns
#

set conf(homeurl)	%HOMEURL%

#
# Chemins utiliss par les scripts
#

set conf(pkg)		%PKGTCL%
set conf(lib)		%DESTDIR%/lib
set conf(libauth)	$conf(lib)/libauth.tcl

#
# Dfinition des noms des pages " trous"
#

set conf(err)		$conf(lib)/erreur.html
set conf(page)		$conf(lib)/grptraitemodif.html
set conf(ok)		$conf(lib)/actionok.html

#
# Quelques paramtres du script
#

set conf(auth)		%AUTH%
set conf(nologin)	%NOLOGIN%
set conf(admin)		%GRPROOT%

set conf(taille)	20

set conf(form)		{
	{groupe		1 1}
	{valider	1 1}
}

set conf(formcomplete)	{
	{descr		1 1}
	{vraismembres	1 1}
	{utilisateurs	0 99999}
	{membres	0 99999}
}

#
# Les outils du parfait concepteur de pages Web dynamiques...
#

lappend auto_path $conf(pkg)
package require webapp
package require pgsql

#
# On y va !
#

# ::webapp::cgidebug ; exit

source $conf(libauth)

###############################################################################
# Procdures auxiliaires
###############################################################################

proc actualiser {groupe descr vraismembres} {
    global conf

    #
    # Constituer la listbox pour les membres
    #

    set liste {}
    foreach u [lsort $vraismembres] {
	set tab($u) {}
	lappend liste [list $u $u]
    }
    set membres [::webapp::form-menu membres $conf(taille) 1 $liste {}]

    #
    # Constituer la listbox pour les autres utilisateurs
    #

    set liste {}
    foreach u [auth-searchuser nonexistentarray {+login}] {
	if {! [info exists tab($u)]} then {
	    lappend liste [list $u $u]
	}
    }
    set utilisateurs [::webapp::form-menu utilisateurs $conf(taille) 1 $liste {}]

    #
    # Mettre en forme HTML la description
    #

    set htmldescr [::webapp::html-string $descr]

    #
    # Envoi de la page aprs substitution
    #

    ::webapp::send html [::webapp::file-subst $conf(page) \
				[list \
					[list %GROUPE%       $groupe] \
					[list %DESCR%        $htmldescr] \
					[list %VRAISMEMBRES% $vraismembres] \
					[list %LISTETOUS%    $utilisateurs] \
					[list %LISTEMEMBRES% $membres] \
				    ] \
			    ]
}

proc modifier-membres {vraismembres enplus enmoins} {
    #
    # Constituer l'ensemble de dpart
    #

    foreach m $vraismembres {
	set tab($m) {}
    }

    #
    # Ajouter les membres en plus
    #

    foreach m $enplus {
	set tab($m) {}
    }

    #
    # Retirer les membres en moins
    #

    foreach m $enmoins {
	catch {unset tab($m)}
    }

    #
    # Retourner le rsultat
    #

    return [array names tab]
}

##############################################################################
# Programme principal
##############################################################################

proc main {} {
    global conf

    #
    # Initialisation
    #

    init-auth $conf(nologin) $conf(auth) $conf(admin) $conf(err) $conf(form) ftab login

    set valider [lindex $ftab(valider) 0]
    set groupe [lindex $ftab(groupe) 0]

    #
    # Vrifier les informations du groupe
    #

    if {! [auth-lsgroup tabgrp]} then {
	::webapp::error-exit $conf(err) "Rcupration des groupes impossible."
    }

    if {! [info exists tabgrp($groupe)]} then {
	::webapp::error-exit $conf(err) \
	    "Groupe '$groupe' inexistant. Suppression refuse."
    }

    #
    # Est-ce la premire fois qu'on rentre dans ce script ?
    #

    if {[string equal $valider "Rinitialiser"]} then {
	set valider "Slectionner"
    }

    if {[string equal $valider "Slectionner"]} then {
	#
	# Oui : prendre les valeurs dans la base
	#
	set descr        [lindex $tabgrp($groupe) 0]
	set vraismembres [lindex $tabgrp($groupe) 1]
    } else {
	#
	# Non : prendre les valeurs dans le formulaire
	#

	if {[llength [::webapp::get-data ftab $conf(formcomplete)]] == 0} then {
	    ::webapp::error-exit $conf(err) "Formulaire invalide: $ftab(_error)"
	}
	set descr	 [lindex $ftab(descr) 0]
	set vraismembres [lindex $ftab(vraismembres) 0]
	set utilisateurs $ftab(utilisateurs)
	set membres      $ftab(membres)
    }

    #
    # Suivant la valeur du bouton de validation :
    #   - Slectionner : entre dans la boucle
    #   - >> : ajouter des utilisateurs au groupe
    #   - << : retirer des utilisateurs du groupe
    #   - Enregistrer : enregistrer les valeurs courantes
    #

    switch -- $valider {
	Slectionner {
	    actualiser $groupe $descr $vraismembres
	}
	{>>} {
	    set vraismembres [modifier-membres $vraismembres $utilisateurs {}]
	    actualiser $groupe $descr $vraismembres
	}
	{<<} {
	    set vraismembres [modifier-membres $vraismembres {} $membres]
	    actualiser $groupe $descr $vraismembres
	}
	Enregistrer {
	    #
	    # Enregistrer les modifications du groupe
	    #

	    if {! [auth-setgroup $groupe $descr $vraismembres msg]} then {
		::webapp::error-exit $conf(err) $msg
	    }

	    #
	    # Indiquer le succs de l'action effectue
	    #

	    set action "de modification du groupe '$groupe'"

	    #
	    # Sortie du rsultat
	    #

	    ::webapp::send html [::webapp::file-subst $conf(ok) \
					[list \
						[list %TITREACTION% $action] \
						[list %COMPLEMENT% ""] \
					    ] \
				    ]
	}
	default {
	    ::webapp::error-exit $conf(err) "Paramtres du formulaire invalides"
	}
    }

    #
    # Dconnexion de la base
    #

    end-auth
}

::webapp::cgi-exec main %DEBUG%
