gest_crans.py 103 KB
Newer Older
bernat's avatar
bernat committed
1
#! /usr/bin/env python
2
# -*- coding: utf-8 -*-
bernat's avatar
bernat committed
3

4
u"""
5
6
Interface utilisateur du système de gestion des machines
et adhérents du crans
bernat's avatar
bernat committed
7

8
Copyright (C) Frédéric Pauget
bernat's avatar
bernat committed
9
10
Licence : GPLv2

11
12
13
14
15
Les fonctions set_* permettent de définir certains
paramètres liés à un adhérent ou une machine, elles posent les questions
puis apellent la méthode adpatée de la classe adhérent ou machine.
Elles prennent toute une instances de cette classe en paramètre.
Elles retournent 1 si l'action à échoué et None si OK.
bernat's avatar
bernat committed
16
Les fonction select permettent de choisir un objet dans la base
17
Retournent None si pas d'objet trouvé.
bernat's avatar
bernat committed
18
19
"""

pauget's avatar
pauget committed
20
21
### Rapport de bug automatique
# Destinataires, si vide n'envoi rien
22
To = ['root@crans.org']
pauget's avatar
pauget committed
23

24
25
26
import string
import os
import sys
27
import dialog
bernat's avatar
bernat committed
28
from whos import aff
29
30
31
import signal
import getopt
from time import strftime, strptime, localtime, mktime, time
32
import re
bernat's avatar
bernat committed
33

34
35
36
import affich_tools
import config
import config.cotisation as cotisation
37
from affich_tools import cprint, to_encoding, to_unicode
bernat's avatar
bernat committed
38
from lock import make_lock, remove_lock
39
from ldap_crans import crans_ldap, blacklist_items, ann_scol, droits_possibles, droits_critiques, smtpserv, script_utilisateur
40
from ldap_crans import Adherent, AssociationCrans, Club, Facture
41
from ldap_crans import Machine, MachineFixe, MachineWifi, MachineCrans, BorneWifi
42
from ldap_crans import tz, generalizedTimeFormat, fromGeneralizedTimeFormat
43
44
45
46
import user_tests

isadm = user_tests.isadm()
isdeconnecteur = user_tests.isdeconnecteur()
bernat's avatar
bernat committed
47

48
49
db = crans_ldap()
droits = db.search("uid=%s" % script_utilisateur)['adherent'][0].droits()
50
isimprimeur =  u"Imprimeur" in droits
dimino's avatar
dimino committed
51
iscontroleur = u'Tresorier' in droits
52
isbureau = u'Bureau' in droits
53
encoding = sys.stdin.encoding or 'UTF-8'
54

55
56
if u'Nounou' in droits:
    if os.path.exists(os.path.expanduser('~/.dialogrc')):
57
        dialogrc='~/.dialogrc'
58
59
60
61
62
63
64
65
66
67
    else:
        dialogrc='/etc/dialog.rc'
    dlg = dialog.Dialog(DIALOGRC=dialogrc)
    dialog_theme='DIALOGRC='+dialogrc
else:
    dlg = dialog.Dialog()
    dialog_theme=''


def dialog(arg):
68
    return affich_tools.dialog(u'Gestion des adhérents et machines du Crans', arg, dialog_theme)
69

70
in_facture = None
bernat's avatar
bernat committed
71
#########################################################################
72
## Fonctions de remplissage ou modification des paramètres d'un adhérent
bernat's avatar
bernat committed
73

glondu's avatar
glondu committed
74
def set_bases(adher):
75
    u"""
76
    Définition des paramètres de bases d'un adhérent :
bernat's avatar
bernat committed
77
78
        * Nom
        * Prenom
79
        * Téléphone
bernat's avatar
bernat committed
80
        * Chambre
bernat's avatar
bernat committed
81
    """
82

bernat's avatar
bernat committed
83
    # Construction de la boite de dialogue
84
    arg = u'--title "Inscription adhérent" '
glondu's avatar
glondu committed
85
86
    arg += u'--form "" 0 0 0 '
    arg += u'"Nom :"       1 1 "%s" 1 13 20 20 ' % adher.nom()
87
88
    arg += u'"Prénom :"    2 1 "%s" 2 13 20 20 ' % adher.prenom()
    arg += u'"Numéro de téléphone :" 3 1 "%s" 3 23 15 00 ' % adher.tel()
glondu's avatar
glondu committed
89
    arg += u'"Chambre :"   4 1 "%s" 4 11 05 00 ' % adher.chbre()
90
91
    arg += u'"(bat+numéro)" 4 17 "" 0 0 0 0 '
    arg += u'"EXT pour chambre extérieure au campus" 5 1 "" 0 0 0 0 '
92

bernat's avatar
bernat committed
93
    # Affichage
glondu's avatar
glondu committed
94
95
    annul, result = dialog(arg)
    if annul: return 1
96

bernat's avatar
bernat committed
97
98
    # Traitement
    err = ''
glondu's avatar
glondu committed
99
100
    try: adher.nom(result[0])
    except ValueError, c: err += c.args[0] + '\n'
bernat's avatar
bernat committed
101

glondu's avatar
glondu committed
102
103
    try: adher.prenom(result[1])
    except ValueError, c: err += c.args[0] + '\n'
bernat's avatar
bernat committed
104

glondu's avatar
glondu committed
105
106
    try: adher.tel(result[2])
    except ValueError, c: err += c.args[0] + '\n'
107

Nicolas Bruot's avatar
Nicolas Bruot committed
108
109
110
111
112
113
114
115
116
    # Un adhérent du même nom existe-t-il déjà ?
    req = 'nom=' + result[0] + '&prenom=' + result[1]
    if len(db.search(req)['adherent']) > 0:
        arg = u'--title "Inscription adhérent" '
        arg += u'--yesno "Un adhérent du même nom existe déjà.'
        arg += u'\nEst-ce bien une première inscription ?" 0 0'
        no, res = dialog(arg)
        if no:
            return 1
117

glondu's avatar
glondu committed
118
    err += _set_chbre(adher, result[3])
119

bernat's avatar
bernat committed
120
    # Des erreurs ?
glondu's avatar
glondu committed
121
    if err:
122
        arg = u'--title "Inscription adhérent" '
123
        arg += u'--msgbox "%s\n\n" 0 0' % to_unicode(err)
bernat's avatar
bernat committed
124
125
126
        dialog(arg)
        # On redemande
        return set_bases(adher)
127

glondu's avatar
glondu committed
128
    if adher.chbre() == 'EXT':
129
        # Il faut demander l'adresse extérieure
130
        if set_addr_ext(adher):
bernat's avatar
bernat committed
131
132
            # Annulation
            return set_bases(adher)
133

glondu's avatar
glondu committed
134
def _set_chbre(adher, chbre):
135
    u""" Attribution de la chambre chbre à l'adhérent fourni
136
    Retourne une chaine (unicode) avec l'erreur éventuelle
137
    """
glondu's avatar
glondu committed
138
    if chbre == '????':
139
        # Réservé à un usage interne
bernat's avatar
bernat committed
140
        return u'Chambre invalide\n'
141

142
    try: c = adher.chbre(chbre)
glondu's avatar
glondu committed
143
    except EnvironmentError, c: return c.args[0] + '\n'
144
    except ValueError, c:
glondu's avatar
glondu committed
145
        if len(c.args) == 2:
146
            # La chambre est occupée
bernat's avatar
bernat committed
147
148
            squatteur = c.args[1]
            aff(squatteur)
149
150
151
            arg = u'--title "Inscription adhérent" '
            arg += u'--yesno "Un adhérent (%s) occupe déjà cette chambre.\n' % squatteur.Nom()
            arg += u'\nChanger la chambre de cet adhérent ?" 0 0'
bernat's avatar
bernat committed
152
            no, res = dialog(arg)
glondu's avatar
glondu committed
153
            if not no:
154
155
                squatteur.chbre('????')
                squatteur.save()
156
                # On recommence, le géneur doit être parti.
157
                return _set_chbre(adher, chbre)
158
        return c.args[0] + '\n'
159

160
    return u''
161

glondu's avatar
glondu committed
162
def set_addr_ext(adher):
163
    u""" Définition de l'adresse extérieure d'un adhérent
164
165
    La chambre de cet adhérent doit être EXT, sinon erreur """
    arg = u'--title "Adresse extérieure de %s" ' % adher.Nom()
glondu's avatar
glondu committed
166
167
168
    arg += u'--form "" 0 0 0 '
    arg += u'"" 1 1 "%s" 1 1 46 50 ' % adher.adresse()[0]
    arg += u'"" 2 1 "%s" 2 1 46 50 ' % adher.adresse()[1]
169
    arg += u'"Code postal :" 3 1 "%s" 3 15 6 0 ' % adher.adresse()[2]
glondu's avatar
glondu committed
170
    arg += u'"Ville :" 3 21 "%s" 3 30 17 30 ' % adher.adresse()[3]
bernat's avatar
bernat committed
171
    # Affichage
glondu's avatar
glondu committed
172
173
    annul, result = dialog(arg)
    if annul: return 1
174

glondu's avatar
glondu committed
175
176
    try: adher.adresse(result)
    except ValueError, c:
177
        arg = u'--title "Adresse extérieure de %s" ' % adher.Nom()
178
        arg += u'--msgbox "%s\n\n\n" 0 0' % to_unicode(c.args[0])
bernat's avatar
bernat committed
179
180
181
        dialog(arg)
        # On redemande
        return set_addr_ext(adher)
182

glondu's avatar
glondu committed
183
def set_etudes(adher):
184
    u"""
185
186
187
    Définition des études en 3 questions :
        * établissement
        * année administrative
bernat's avatar
bernat committed
188
        * section/labo
bernat's avatar
bernat committed
189
190
    """

glondu's avatar
glondu committed
191
    def __etudes_etab():
bernat's avatar
bernat committed
192
        arg = u'--title "Etudes de %s (1/3)" ' % adher.Nom()
glondu's avatar
glondu committed
193
194
        if adher.etudes(0):
            arg += u'--default-item "%s" ' % adher.etudes(0)
195
        arg += u'--menu "Choisissez l\'établissement : " 0 0 0 '
glondu's avatar
glondu committed
196
197
198
199
200
201
        if adher.etudes(0):
            arg += u'"Autre" "" '
        arg += u'"ENS" "" '
        arg += u'"IUT Cachan" "" '
        arg += u'"Maximilien Sorre" "" '
        arg += u'"Gustave Eiffel" "" '
202
203
        arg += u'"EFREI" "" '
        arg += u'"ESTP" "" '
204
205
206
207
208
209
        arg += u'"P1" "Université Panthéon Sorbonne" '
        arg += u'"P2" "Université Panthéon Assas" '
        arg += u'"P3" "Université de la Sorbonne Nouvelle" '
        arg += u'"P4" "Université Paris Sorbonne" '
        arg += u'"P5" "Université René Descartes" '
        arg += u'"P6" "Université Pierre et Marie Curie" '
210
        arg += u'"P7" "Université Paris Diderot" '
211
212
213
214
215
216
        arg += u'"P8" "Université Vincennes Saint Denis" '
        arg += u'"P9" "Université Paris Dauphine" '
        arg += u'"P10" "Université de Nanterre" '
        arg += u'"P11" "Université de Paris Sud (Orsay)" '
        arg += u'"P12" "Université Val de Marne" '
        arg += u'"P13" "Université Paris Nord" '
glondu's avatar
glondu committed
217
        arg += u'"IUFM" "" '
218
        arg += u'"Personnel ENS" "dans les appartements de l\'ENS" '
glondu's avatar
glondu committed
219
220
        if not adher.etudes(0):
            arg += u'"Autre" ""'
221

glondu's avatar
glondu committed
222
223
        annul, result = dialog(arg)
        if annul: return 1
224

glondu's avatar
glondu committed
225
        if result[0] == 'Autre':
bernat's avatar
bernat committed
226
            arg = u'--title "Etudes de %s (1/3)" ' % adher.Nom()
227
            arg += u'--inputbox "Précisez l\'établissement d\'études" 0 0 "%s"' % adher.etudes(0)
glondu's avatar
glondu committed
228
229
230
            annul, result = dialog(arg)
            if annul: return 1
            if result == ['']:
bernat's avatar
bernat committed
231
232
                # Pas bon
                arg = u'--title "Etudes (2/3)" '
233
                arg += u'--msgbox "Réponse invalide\n\n\n" 0 0'
bernat's avatar
bernat committed
234
235
                dialog(arg)
                return __etudes_etab()
236

bernat's avatar
bernat committed
237
        etudes[0] = result[0]
238

glondu's avatar
glondu committed
239
    def __etudes_annee():
bernat's avatar
bernat committed
240
        arg = u'--title "Etudes de %s (2/3)" ' % adher.Nom()
glondu's avatar
glondu committed
241
242
        if etudes[0] == 'ENS':
            arg += u'--default-item "%s" ' % adher.etudes(1)
243
            arg += u'--menu "Choisissez l\'année administrative" 0 0 0 '
glondu's avatar
glondu committed
244
245
            arg += u'"1" "License" '
            arg += u'"2" "Master 1" '
246
            arg += u'"3" "Agrégation" '
glondu's avatar
glondu committed
247
            arg += u'"4" "Master 2" '
248
249
250
            arg += u'"5" "1ère année thèse" '
            arg += u'"6" "2ème année thèse" '
            arg += u'"7" "3ème année thèse" '
glondu's avatar
glondu committed
251
252
253
254
255
            arg += u'"Autre" ""'
            annul, result = dialog(arg)
            if annul: return 1
        elif etudes[0] in [ 'P1', 'P2', 'P3', 'P4', 'P5', 'P6', 'P7', 'P8', 'P9', 'P10', 'P11', 'P12', 'P13' ]:
            arg += u'--default-item "%s" ' % adher.etudes(1)
256
257
258
            arg += u'--menu "Choisissez l\'année administrative" 0 0 0 '
            arg += u'"Deug 1" "Deug 1ère année" '
            arg += u'"Deug 2" "Deug 2ème année" '
glondu's avatar
glondu committed
259
            arg += u'"Licence" "" '
260
261
262
263
264
            arg += u'"Master 1" "Master 1ère année" '
            arg += u'"Master 2" "Master 2ème année" '
            arg += u'"Thèse 1" "1ème année thèse" '
            arg += u'"Thèse 2" "2ème année thèse" '
            arg += u'"Thèse 3" "3ème année thèse" '
glondu's avatar
glondu committed
265
266
267
            arg += u'"Autre" ""'
            annul, result = dialog(arg)
            if annul: return 1
268
269
        elif etudes[0] == "Personnel ENS":
            result = ['0']
glondu's avatar
glondu committed
270
271
        else:
            result = ['Autre']
272

glondu's avatar
glondu committed
273
        if result[0] == 'Autre':
bernat's avatar
bernat committed
274
            arg = u'--title "Etudes de %s (2/3)" ' % adher.Nom()
275
            arg += u'--inputbox "Année adminstrative :\nET UNIQUEMENT l\'ANNEE : la section sera demandée après." 0 0 "%s"' % adher.etudes(1)
glondu's avatar
glondu committed
276
277
278
            annul, result = dialog(arg)
            if annul: return 1
            if result == ['']:
bernat's avatar
bernat committed
279
280
                # Pas bon
                arg = u'--title "Etudes (2/3)" '
281
                arg += u'--msgbox "Réponse invalide\n\n\n" 0 0'
bernat's avatar
bernat committed
282
283
                dialog(arg)
                return __etudes_annee()
284

bernat's avatar
bernat committed
285
        etudes[1] = result[0]
bernat's avatar
bernat committed
286

glondu's avatar
glondu committed
287
    def __etudes_section():
bernat's avatar
bernat committed
288
        arg = u'--title "Etudes de %s (3/3)" ' % adher.Nom()
289

bernat's avatar
bernat committed
290
        # Pour l'ENS
glondu's avatar
glondu committed
291
292
        if etudes[0] == 'ENS':
            arg += u'--default-item "%s" ' % adher.etudes(2)
dubost's avatar
dubost committed
293
            if etudes[1] in '1234':
glondu's avatar
glondu committed
294
                arg += u'--menu "Choisissez la section : " 0 0 0 '
295
            else:
glondu's avatar
glondu committed
296
                arg += u'--menu "Choisissez le laboratoire :" 0 0 0 '
297
            if not etudes[1] in '1234':
298
                arg += u'"CMLA" "Centre de Mathématiques et de Leurs Applications" '
299
                arg += u'"GAPP" "Groupe d\'Analyse des Politiques Publiques" '
glondu's avatar
glondu committed
300
                arg += u'"IDHE" "Institutions et Dynamiques Historiques de l\'Economie" '
301
302
303
304
305
306
307
                arg += u'"LBPA" "Laboratoire de Biotechnologies et Pharmacologie génétique Appliquées" '
                arg += u'"LMT" "Laboratoire de Mécanique et Technologie" '
                arg += u'"LPQM" "Laboratoire de Photonique Quantique et Moléculaire" '
                arg += u'"LSV" "Laboratoire de Spécification et Vérification" '
                arg += u'"LURPA" "Laboratoire Universitaire de Recherche en Production Automatisée" '
                arg += u'"PPSM" "Laboratoire de Photophysique et Photochimie Supramoléculaires et Macromoléculaires" '
                arg += u'"SATIE" "Systèmes et Applications des Technologies de l\'Information et de l\'Energie" '
glondu's avatar
glondu committed
308
                arg += u'"STEF" "Sciences Techniques Education Formation" '
dubost's avatar
dubost committed
309
            if etudes[1] in '1234':
310
                arg += u'"A0" "Informatique" '
311
                arg += u'"A1" "Mathématiques" '
glondu's avatar
glondu committed
312
313
314
315
                arg += u'"A2" "Physique fondamentale" '
                arg += u'"A\'\'2" "Chimie" '
                arg += u'"A3" "Biochimie" '
                if etudes[1] == '1':
316
                    arg += u'"SAPHIRE" "Sciences Appliquées en PHysique et Ingénierie pour la Recherche et l\'Enseignement" '
parret-freaud's avatar
parret-freaud committed
317
                elif etudes[1] == '2':
318
319
320
321
                    arg += u'"EEA" "Électronique, électrotechnique et automatique" '
                    arg += u'"B1" "Mécanique" '
                    arg += u'"B2" "Génie civil" '
                    arg += u'"B3" "Génie mécanique" '
glondu's avatar
glondu committed
322
                else:
323
324
325
326
327
328
                    arg += u'"B1" "Mécanique" '
                    arg += u'"B2" "Génie civil" '
                    arg += u'"B3" "Génie mécanique" '
                    arg += u'"A\'2" "Physique appliquée" '
                    arg += u'"B4" "Génie électrique" '
                arg += u'"C" "Art et création industrielle" '
glondu's avatar
glondu committed
329
330
331
                arg += u'"D2" "Economie gestion" '
                arg += u'"D3" "Sciences sociales" '
                arg += u'"E" "Anglais" '
332

glondu's avatar
glondu committed
333
334
335
336
            arg += u'"Autre" ""'
            annul, result = dialog(arg)
            if annul: return 1
            if result == ['']:
bernat's avatar
bernat committed
337
338
                # Pas bon
                arg = u'--title "Etudes (2/3)" '
339
                arg += u'--msgbox "Réponse invalide\n\n\n" 0 0'
bernat's avatar
bernat committed
340
341
                dialog(arg)
                return __etudes_annee()
342
343
        elif etudes[0] == 'Personnel ENS':
            result = ['n/a']
glondu's avatar
glondu committed
344
345
        else:
            result = ['Autre']
bernat's avatar
bernat committed
346

glondu's avatar
glondu committed
347
        if result[0] == 'Autre':
bernat's avatar
bernat committed
348
            arg = u'--title "Etudes de %s (3/3)" ' % adher.Nom()
glondu's avatar
glondu committed
349
350
351
352
            arg += u'--inputbox "Section : " 0 0 "%s"' % adher.etudes(2)
            annul, result = dialog(arg)
            if annul: return 1
            if result == ['']:
bernat's avatar
bernat committed
353
354
                # Pas bon
                arg = u'--title "Etudes (3/3)" '
355
                arg += u'--msgbox "Réponse invalide\n\n\n" 0 0'
bernat's avatar
bernat committed
356
357
                dialog(arg)
                return __etudes_section()
358

bernat's avatar
bernat committed
359
        etudes[2] = result[0]
bernat's avatar
bernat committed
360

glondu's avatar
glondu committed
361
    etudes = ['', '', '']
362

bernat's avatar
bernat committed
363
    step = 1
glondu's avatar
glondu committed
364
365
366
367
368
369
370
371
    while 1:
        if step == 1:
            if __etudes_etab(): return 1
            else: step += 1
        if step == 2:
            if __etudes_annee(): step -= 1
            else: step += 1
        if step == 3:
372
            if __etudes_section(): step -= 1
glondu's avatar
glondu committed
373
            else: break
374
    try:
bernat's avatar
bernat committed
375
        adher.etudes(etudes)
376
    except ValueError, c:
bernat's avatar
bernat committed
377
        arg = u'--title "Etudes de %s" ' % adher.Nom()
378
        arg += u'--msgbox "%s\n\n\n" 0 0' % to_unicode(c.args[0])
bernat's avatar
bernat committed
379
380
        dialog(arg)
        return set_etudes(adher)
chove's avatar
chove committed
381

glondu's avatar
glondu committed
382
def set_mail(adher):
383
    u"""
384
385
    Choix d'une adresse mail crans ou extérieure.
    Retourne ensuite le résultat de :
bernat's avatar
bernat committed
386
387
        * set_mail_ext si adresse ext
        * set_compte si compte crans
bernat's avatar
bernat committed
388
    """
glondu's avatar
glondu committed
389
    if u'Nounou' in adher.droits() and not isadm:
bernat's avatar
bernat committed
390
        arg = u'--title "Adresse mail de %s" '  % adher.Nom()
391
        arg += u'--msgbox "Vous n\'avez pas les droits necessaires pour effectuer cette opération.\n\n\n" 0 0'
bernat's avatar
bernat committed
392
393
        dialog(arg)
        return
394

395
396
397
398
    if not isinstance(adher, Club) and not adher.adherentPayant():
        set_mail_ext(adher)
        return

glondu's avatar
glondu committed
399
    while 1:
dubost's avatar
dubost committed
400
        arg = u'--title "Adresse mail de %s" '  % adher.Nom()
401
402
        arg += u'--menu "Adresse mail de l\'adhérent :" 0 0 0 '
        arg += u'"Adresse mail extérieure" "" '
dubost's avatar
dubost committed
403
404
405
        if adher.compte():
            arg += u'"Laisser le compte crans" "(login : %s)"' % adher.compte()
        else:
406
            arg += u'"Créer un compte crans" "(adresse @crans.org)"'
407

dubost's avatar
dubost committed
408
409
        annul, result = dialog(arg)
        if annul: return 1
410

dubost's avatar
dubost committed
411
412
        if result[0].split()[0] == 'Laisser':
            break
413
        elif result[0].split()[1] == u'un':
dubost's avatar
dubost committed
414
            if not set_compte(adher): break
415
416
        else:
            if not set_mail_ext(adher): break
bernat's avatar
bernat committed
417

glondu's avatar
glondu committed
418
def set_mail_ext(adher):
419
    u"""
420
    Demande l'adresse mail extérieure d'un adhérent
bernat's avatar
bernat committed
421
422
    """
    default = adher.mail()
423
    if default.endswith('@crans.org'):
424
        # C'était une adresse crans
bernat's avatar
bernat committed
425
        default = ''
426

427
    arg = u'--title "Adresse mail extérieure pour  %s" '  % adher.Nom()
glondu's avatar
glondu committed
428
429
430
    arg += u'--inputbox "Adresse : " 0 0 "%s"' % default
    annul, result = dialog(arg)
    if annul: return 1
431

glondu's avatar
glondu committed
432
    try: adher.mail(result[0])
433
    except ValueError, c:
434
        arg = u'--title "Adresse mail extérieure de %s" ' % adher.Nom()
435
        arg += u'--msgbox "%s\n\n\n" 0 0' % to_unicode(c.args[0])
bernat's avatar
bernat committed
436
437
        dialog(arg)
        return set_mail_ext(adher)
bernat's avatar
bernat committed
438

pauget's avatar
pauget committed
439
440
def set_etat_civil(adher):
    u"""
441
    Modifie l'état-civil (nom, prénom) d'un adhérent.
pauget's avatar
pauget committed
442
    """
glondu's avatar
glondu committed
443
    if u'Nounou' in adher.droits() and not isadm:
pauget's avatar
pauget committed
444
        arg = u'--title "Adresse mail de %s" '  % adher.Nom()
445
        arg += u'--msgbox "Vous n\'avez pas les droits necessaires pour effectuer cette opération.\n\n\n" 0 0'
pauget's avatar
pauget committed
446
447
        dialog(arg)
        return
448

pauget's avatar
pauget committed
449
    # Construction de la boite de dialogue
450
    arg = u'--title "État-civil de %s" ' % adher.Nom()
glondu's avatar
glondu committed
451
452
    arg += u'--form "" 0 0 0 '
    arg += u'"Nom :"       1 1 "%s" 1 13 20 20 ' % adher.nom()
453
    arg += u'"Prénom :"    2 1 "%s" 2 13 20 20 ' % adher.prenom()
454

pauget's avatar
pauget committed
455
456
457
    # Affichage
    annul, result = dialog(arg)
    if annul: return
458

pauget's avatar
pauget committed
459
460
461
462
    # Traitement
    err = ''
    try: adher.nom(result[0])
    except ValueError, c: err += c.args[0] + '\n'
463

pauget's avatar
pauget committed
464
465
    try: adher.prenom(result[1])
    except ValueError, c: err += c.args[0] + '\n'
466

pauget's avatar
pauget committed
467
468
    # Des erreurs ?
    if err:
469
        arg = u'--title "État-civil de %s" ' % adher.Nom()
470
        arg += u'--msgbox "%s\n\n" 0 0' % to_unicode(err)
pauget's avatar
pauget committed
471
472
473
        dialog(arg)
        # On redemande
        return set_etat_civil(adher)
474

475
    # On change éventuellement le compte
pauget's avatar
pauget committed
476
    if adher.compte():
477
        # On demande au câbleur s'il faut garder le compte ou pas
pauget's avatar
pauget committed
478
        arg = u'--title "Modification du compte de %s" ' % adher.Nom()
479
        arg += u'--colors --defaultno --yesno "Changer le login de l\'adhérent ?\n'
pauget's avatar
pauget committed
480
        arg += u'Son login actuel est %s.\n\n' % adher.compte()
481
        arg += u'Choisir Oui si l\'adhérent n\'a jamais utilisé son compte.\n\n'
pauget's avatar
pauget committed
482
        arg += u'\Zr\Z1AVERTISSEMENT :\n'
483
484
        arg += u'Le changement de login entraîne la suppression irréversible du compte, '
        arg += u'et donc de tous les fichiers, mails, etc. associés !\Z0\ZR\n\n\n" '
pauget's avatar
pauget committed
485
486
        arg += u'0 0'
        no = not dialog(arg)[0]
487

pauget's avatar
pauget committed
488
489
490
        if no:
            # L'utilisateur n'utilise pas son compte, on le supprime...
            adher.supprimer_compte()
491
            # ..et on le recrée (ou on met une adresse mail extérieure)
pauget's avatar
pauget committed
492
            if set_mail(adher):
493
                # Le changement d'adresse a été annulé, on recommence tout
pauget's avatar
pauget committed
494
495
496
                adher.restore()
                return set_etat_civil(adher)

glondu's avatar
glondu committed
497
def set_compte(adher):
498
    u"""
499
    Créé un compte sur vert pour un adhérent.
bernat's avatar
bernat committed
500
    """
501

bernat's avatar
bernat committed
502
    # Message d'avertissement
503
    arg = u'--title "Création compte crans pour %s" ' % adher.Nom()
glondu's avatar
glondu committed
504
    arg += u'--colors --yesno "\Zr\Z1AVERTISSEMENT :\Zn \n'
505
    arg += u'L\'adhérent devra impérativement consulter l\'adresse mail associée\n\n\n\\ZnContinuer ?" '
glondu's avatar
glondu committed
506
    arg += u'0 0'
bernat's avatar
bernat committed
507
    no, res = dialog(arg)
glondu's avatar
glondu committed
508
    if no: return 1
509

510
    # Il faut déterminer le login
bernat's avatar
bernat committed
511
    login = adher.nom()
512

513
    # Première tentative
bernat's avatar
bernat committed
514
    err = 0
515
516
    try:
        login = adher.compte(login)
glondu's avatar
glondu committed
517
    except ValueError, c:
518
        try:
bernat's avatar
bernat committed
519
            c.args[1]
520
            # Le compte existe => 2ème tentative (1ere lettre prénom + nom)
glondu's avatar
glondu committed
521
            login = adher.prenom()[0] +login
bernat's avatar
bernat committed
522
            login = login.lower()
glondu's avatar
glondu committed
523
            err = 2
524
        except:
bernat's avatar
bernat committed
525
            err = 1
526
    except EnvironmentError, c: err = 1 # Locké
527

glondu's avatar
glondu committed
528
    if err:
bernat's avatar
bernat committed
529
530
        while 1:
            # Mauvais login => on demande
531
            arg = u'--title "Création d\'un compte crans pour %s" ' % adher.Nom()
glondu's avatar
glondu committed
532
            arg += u'--inputbox "Choix du login\n'
533
534
535
            arg += u'Le login doit faire au maximum %s caractères\n' % config.maxlen_login
            arg += u'Il ne doit pas être un pseudo ou prénom mais doit être relié au nom de famille\n'
            arg += u'Seuls les caractères alphabétiques et le - sont autorisés" '
glondu's avatar
glondu committed
536
537
538
539
            arg += u'0 0 "%s"' % login
            annul, result = dialog(arg)
            if annul: return 1
            login = result[0]
540

bernat's avatar
bernat committed
541
            e = 0
glondu's avatar
glondu committed
542
543
544
545
            try: login = adher.compte(login)
            except EnvironmentError, c: e = c.args[0]
            except ValueError, c: e = c.args[0]
            if e:
546
                arg = u'--title "Création compte crans pour %s" ' % adher.Nom()
547
                arg += u'--msgbox "%s\n\n\n" 0 0' % to_unicode(e)
bernat's avatar
bernat committed
548
549
550
                dialog(arg)
                continue
            break
bernat's avatar
bernat committed
551

552
553
    txt = u"Le compte ne sera créé que lors de l'enregistrement des données\n\n"
    txt += u"L'adresse mail de l'adhérent est : %s@crans.org\n" % login
554

glondu's avatar
glondu committed
555
    a = adher.canonical_alias()
glondu's avatar
glondu committed
556
    if a:
557
        txt += u"L'adhérent possède également l'alias : %s" % a
glondu's avatar
glondu committed
558
    else:
559
        txt += u"\n\Zr\Z1L'adresse mail %s.%s@crans.org étant déja prise l'adhérent ne peut pas l'utiliser.\Zn" % (adher.prenom(), adher.nom())
560

glondu's avatar
glondu committed
561
    txt += u'\n'
562

563
    arg = u'--title "Création compte crans pour %s" ' % adher.Nom()
glondu's avatar
glondu committed
564
    arg += u'--colors --msgbox "%s\n\n\n" 0 0' % txt
bernat's avatar
bernat committed
565
    dialog(arg)
566

glondu's avatar
glondu committed
567
def set_droits(adher):
568
    u""" Définition des droits de l'adhérent """
bernat's avatar
bernat committed
569
    arg = u'--title "Droits de %s" ' % adher.Nom()
glondu's avatar
glondu committed
570
571
    arg += u'--separate-output '
    arg += u'--checklist "" 0 0 0 '
572

bernat's avatar
bernat committed
573
    droits = adher.droits()
glondu's avatar
glondu committed
574
    for key in droits_possibles:
bernat's avatar
bernat committed
575
        actif = key in droits
glondu's avatar
glondu committed
576
        if actif: actif = u'on'
577
        if isadm or key not in droits_critiques:
578
            arg += u'"%s" " " "%s" ' % (key, actif)
579

glondu's avatar
glondu committed
580
581
    annul, result = dialog(arg)
    if annul: return 1
582

583
584
585
586
587
588
589
590
591
592
593
594
    ### Traitement
    # On regarde les MLs auxquelles l'adhérent était inscrit grâce à ses
    # droits et auxquelles il ne sera pas désabonné
    # (MLs à débonnement manuel)
    droits_mls = config.droits_mailing_listes

    # On nettoie la sortie de dialog
    new = []
    for droit in result:
        droit = droit.strip()
        if droit == '': continue
        if droit not in droits_possibles:
595
            raise ValueError(u'Droit %s incorrect' % droit)
596
597
        new.append(droit)

598
599
600
601
602
603
    # Dans le cas où l'utilisateur qui modifie n'est pas Nounou, on ajoute les
    # droits critiques que l'adhérent possède déjà
    if not isadm:
        for key in [d for d in droits_critiques if d in adher.droits()]:
            new.append(key)

604
605
606
607
608
609
610
    # Droits supprimés
    diff = [droit for droit in adher.droits()
            if droit not in new]

    # Droits supprimés qui abonnaient à une ML
    old_mls = []
    for droit in diff:
611
        old_mls.extend([m for m in droits_mls.keys()
612
613
614
615
616
                if m[0] == '+' and droit in droits_mls[m]
                and m not in old_mls])

    # MLs pour lesquelles un autre droit abonne encore
    for droit in new:
617
        for ml in [m for m in old_mls if droit in droits_mls.get(m, [])]:
Michel Blockelet's avatar
Michel Blockelet committed
618
            old_mls.remove(ml)
619

620
    # Choix des MLs auxquelles désabonner
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
    if old_mls:
        arg = u'--title "Mailing-listes dont désabonner %s" ' % adher.Nom()
        arg += u'--separate-output '
        arg += u'--checklist "%s a été abonné automatiquement' % adher.Nom()
        arg += u' aux MLs suivantes lorsqu\'il a obtenu ses droits." 0 0 0 '
        for ml in old_mls:
            arg += u'"%s" " " "" ' % ml[1:]
        annulmls, resultmls = dialog(arg)
        if annulmls: resultmls = []
        del_mls = []
        for resml in resultmls:
            if resml == '': continue
            del_mls.append(resml.strip())

        if del_mls:
            db.services_to_restart('desabonner_ml',
                    map(lambda m: "%s$%s" % (adher.mail(), m), resultmls))

    # On modifie !
640
    e = None
641
    try:
642
643
644
645
646
647
648
649
650
651
652
        if not isadm:
            adher.droits(result, light=True)
        else:
            adher.droits(result)
    except EnvironmentError, c: e = c.args[0]
    except ValueError, c: e = c.args[0]
    if e:
        arg = u'--title "Modification des droits pour %s" ' % adher.Nom()
        arg += u'--msgbox "%s\n\n\n" 0 0' % to_unicode(e)
        dialog(arg)
        return 1
653

654
655
656
657
658
def set_actif(adher):
    u"""
    Définition de l'état d'activité du compte.
    """
    # Initialisation des différentes checkbox
659
    inactif = on_off(adher.active() == False)
660
661
662
663
664

    # Construction de la boîte de dialogue
    texte = []
    checklist = []

665
    if inactif:
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
        checklist.append(u'"1" "Compte mail/serveur désactivé" "%s"' % (inactif))

    # Il y a qqch de modifiable, on construit la checklist
    arg  = u'--title "Statut du compte %s" ' % adher.Nom()
    arg += u'--separate-output '
    arg += u'--checklist "" 0 0 0 '
    arg += u' '.join(checklist)

    annul, result = dialog(arg)
    if annul: return 1

    # Traitement
    if '1\n' in result:
        adher.active(False)
    else:
        adher.active(True)

glondu's avatar
glondu committed
683
def del_adher(adher):
684
    u"""
685
    Destruction adhérent
bernat's avatar
bernat committed
686
    """
687
688
689
690
691
692
    if u'Nounou' in adher.droits() and not isadm:
        arg = u'--title "Destruction adherent" '
        arg += u'--msgbox "Vous n\'avez pas les droits necessaires pour effectuer cette opération.\n\n\n" 0 0'
        dialog(arg)
        return

693
    quoi = u'Toutes les machines associées à cet adhérent seront détruites'
694
    if adher._data.get('uid', '') != '':
695
        # L'adhérent a un compte
696
697
        has_machines = (adher.machines() != [])
        if not has_machines:
698
            quoi = u'Le compte de cet adhérent sera détruit'
glondu's avatar
glondu committed
699
        else:
bernat's avatar
bernat committed
700
            # Et aussi des machines
701
            # -> soit on détruit tout
bernat's avatar
bernat committed
702
            # -> soit on garde le compte mais on vire les machines
703
704
            arg = u'--title "Destruction adhérent %s " ' % adher.Nom()
            arg += u'--menu "Cette adhérent possède également un compte." 0 0 0 '
glondu's avatar
glondu committed
705
            if adher:
706
707
                arg += u'"1" "Détruire seulement les machines de l\'adhérent" '
                arg += u'"2" "Détruire les machines et le compte de l\'adhérent" '
bernat's avatar
bernat committed
708
                annul, res = dialog(arg)
glondu's avatar
glondu committed
709
710
                if annul: return 1
                if res[0] == '2':
711
                    # On détruit tout
bernat's avatar
bernat committed
712
                    quoi += u' ainsi que son compte'
glondu's avatar
glondu committed
713
                else:
bernat's avatar
bernat committed
714
                    # Destruction uniquement des machines
715
716
                    arg = u'--title "Destruction machines adhérent %s " --colors ' % adher.Nom()
                    arg += u'--inputbox "\Zr\Z1ATTENTION\Zn : la destruction est définitive\nToutes les machines associées à cet adhérent seront détruites, seul le compte sera conservé.\nCommentaire à insérer ?" 0 0'
bernat's avatar
bernat committed
717
                    annul, res = dialog(arg)
glondu's avatar
glondu committed
718
                    if annul: return 1
719
                    for m in adher.machines():
bernat's avatar
bernat committed
720
721
722
                        m.delete(res[0])
                    adher.chbre('EXT')
                    arg = u'--title "Destruction machines" '
723
                    arg += u'--msgbox "Machines détruites\n\n\n" 0 0'
bernat's avatar
bernat committed
724
725
                    dialog(arg)
                    return
726

glondu's avatar
glondu committed
727
    while 1:
728
729
        arg = u'--title "Destruction adhérent %s " --colors ' % adher.Nom()
        arg += u'--inputbox "\Zr\Z1ATTENTION\Zn : la destruction est définitive\n\n%s.\n\nCommentaire à insérer ?" 0 0' % quoi
bernat's avatar
bernat committed
730
        annul, res = dialog(arg)
glondu's avatar
glondu committed
731
732
        if annul: return 1
        if  res[0]: break
bernat's avatar
bernat committed
733
        arg = u'--title "Destruction adherent" '
glondu's avatar
glondu committed
734
        arg += u'--msgbox "Le commentaire est obligatoire\n\n\n" 0 0'
bernat's avatar
bernat committed
735
        dialog(arg)
736

bernat's avatar
bernat committed
737
    adher.delete(res[0])
738

739
740
    arg = u'--title "Destruction adhérent" '
    arg += u'--msgbox "Adhérent détruit\n\n\n" 0 0'
bernat's avatar
bernat committed
741
    dialog(arg)
chove's avatar
chove committed
742
743

###############################################################
744
## Fonctions de remplissage ou modification des paramètres club
chove's avatar
chove committed
745

glondu's avatar
glondu committed
746
def set_responsable(club):
747
    u""" Modifie le responsable d'un club """
chove's avatar
chove committed
748
    arg = u'--title "Responsable du club" '
749
    arg += u'--msgbox "Séléctionnez l\'adhérent responsable du club\n\n\n" 0 0'
chove's avatar
chove committed
750
    dialog(arg)
glondu's avatar
glondu committed
751
752
753
    resp = select(club, u'du responsable du club a', 'ro')
    if not resp: return 1
    else:
bernat's avatar
bernat committed
754
        club.responsable(resp)
chove's avatar
chove committed
755

756
def set_imprimeurs(club):
757
    u""" Modifie les imprimeurs d'un club """
758
759
760
761
762
763
764
765
766
767
768
769
770
    while 1:
        arg = u'--title "Imprimeurs de %s" ' % club.Nom()
        if len(club.imprimeurs()) > 0:
            arg += u'--menu "Action ?" 0 0 0 '
            arg += u'"Enlever" "Enlever un imprimeur" '
        else:
            arg += u'--menu "Il n\'y a aucun imprimeur pour ce club." 0 0 0 '
        arg += u'"Ajouter" "Ajouter un imprimeur" '
        annul, res = dialog(arg)
        if annul: break
        if res[0] == 'Enlever':
            liste = map(lambda s: db.search("aid=%s" % s)['adherent'][0], club.imprimeurs())
            if len(liste) == 1:
771
                # Une seule réponse
772
773
774
775
776
777
                choix = liste[0]
            else:
                # Il faut choisir
                while 1:
                    os.system('clear')
                    choix = None
778
                    cprint(u"Ce club a plusieurs imprimeurs :")
779
780
781
782
783
784
785
786
787
                    aff(liste)
                    i = affich_tools.prompt(u'Votre choix ? (0 pour annuler) aid =')
                    if i == '0': break
                    for v in liste:
                        if v.id() == i:
                            choix = v
                            break
                    if not choix:
                        # Redemande le choix
788
                        cprint (u'Choix invalide')
789
790
                        continue
                    if choix: break
791

792
793
794
795
796
797
798
799
800
            if not choix:
                continue

            arg  = u'--title "Enlever un imprimeur" '
            arg += u'--yesno "Enlever l\'imprimeur %s ? \n\n" 0 0' % choix.Nom()
            no, res = dialog(arg)
            if not no:
                if club.imprimeurs(retirer=str(choix.id())):
                    arg  = u'--title "Enlever un imprimeur" '
801
                    arg += u'--msgbox "Imprimeur enlevé\n\n\n" 0 0'
802
803
804
                    dialog(arg)
                else:
                    arg  = u'--title "Enlever un imprimeur" '
805
                    arg += u'--msgbox "Cet adhérent n\'est pas imprimeur du club !\n\n\n" 0 0'
806
807
                    dialog(arg)