Nettoyage des restes de paiement par année scolaire

Ça fait plus d'un an qu'on est passés aux factures avec
 generalizedTimeFormat
This commit is contained in:
Pierre-Elliott Bécue 2015-11-26 19:27:29 +01:00
parent af0e971764
commit baf79bdda7
13 changed files with 498 additions and 220 deletions

View file

@ -10,39 +10,34 @@ import datetime
from config_srv import adm_only, role from config_srv import adm_only, role
# Valeur par défaut pour les champs d'études # Valeur par défaut pour les champs d'études
etudes_defaults = [u"Établissement inconnu", u"Année inconnue", u"Domaine d'études inconnu"] etudes_defaults = [
u"Établissement inconnu",
u"Année inconnue",
u"Domaine d'études inconnu"
]
gtfepoch = "19700101000000Z" gtfepoch = "19700101000000Z"
##### Gestion des câblages ##### Gestion des câblages
# Selon la date, on met : # Selon la date, on met :
# -ann_scol : Année scolaire en cours
# -periode_transitoire : on accepte ceux qui ont payé l'année dernière # -periode_transitoire : on accepte ceux qui ont payé l'année dernière
# Ne modifier que les dates ! # On récupère l'année scolaire à tout besoin
dat = time.localtime() __annee = time.localtime()[0]
if dat[1] < 8 or dat[1] == 8 and dat[2] < 16:
# Si pas encore début août, on est dans l'année précédente
ann_scol = dat[0]-1
periode_transitoire = False
# sinon on change d'année
elif dat[1] < 10:
# Si pas encore octobre, les gens ayant payé l'année précédente sont
# acceptés
ann_scol = dat[0]
periode_transitoire = True
else:
# Seulement ceux qui ont payé cette année sont acceptés
ann_scol = dat[0]
periode_transitoire = False
# Prochaine période transitoire de l'année # Prochaine période transitoire de l'année version generalizedTimeFormat
gtf_debut_periode_transitoire = "%s0816000000+0200" % (dat[0],) gtf_debut_periode_transitoire = "%s0816000000+0200" % (__annee,)
gtf_fin_periode_transitoire = "%s0930235959+0200" % (dat[0],) gtf_fin_periode_transitoire = "%s0930235959+0200" % (__annee,)
debut_periode_transitoire = time.mktime(time.strptime("%s/08/16 00:00:00" % (dat[0],), "%Y/%m/%d %H:%M:%S"))
fin_periode_transitoire = time.mktime(time.strptime("%s/09/30 23:59:59" % (dat[0],), "%Y/%m/%d %H:%M:%S"))
#Sursis pour les inscription après le 1/11 pour fournir la carte étudiant # Version timestampées timezone-naïves
sursis_carte=8*24*3600 debut_periode_transitoire = time.mktime(time.strptime("%s/08/16 00:00:00" % (__annee,), "%Y/%m/%d %H:%M:%S"))
fin_periode_transitoire = time.mktime(time.strptime("%s/09/30 23:59:59" % (__annee,), "%Y/%m/%d %H:%M:%S"))
# On est en période transitoire si on est dans le bon intervale
periode_transitoire = (debut_periode_transitoire <= time.time() <= fin_periode_transitoire)
ann_scol = __annee
if time.time() <= debut_periode_transitoire:
ann_scol -= 1
# Gel des cableurs pas a jour de cotisation # Gel des cableurs pas a jour de cotisation
# Les droits ne sont pas retires mais il n'y a plus de sudo # Les droits ne sont pas retires mais il n'y a plus de sudo
@ -65,7 +60,8 @@ club_login_shell='/usr/bin/rssh'
# Longueur maximale d'un login # Longueur maximale d'un login
maxlen_login = 25 maxlen_login = 25
shells_possibles = [u'/bin/csh', shells_possibles = [
u'/bin/csh',
u'/bin/sh', # tout caca u'/bin/sh', # tout caca
u'/bin/dash', # un bash light u'/bin/dash', # un bash light
u'/usr/bin/rc', u'/usr/bin/rc',
@ -90,58 +86,169 @@ shells_possibles = [u'/bin/csh',
u'', # le shell vide pour pouvoir les punis u'', # le shell vide pour pouvoir les punis
] ]
shells_gest_crans_order = ["zsh", "bash", "tcsh", "screen", "rbash", "rssh", shells_gest_crans_order = [
"badPassSh", "disconnect_shell"] "zsh",
"bash",
"tcsh",
"screen",
"rbash",
"rssh",
"badPassSh",
"disconnect_shell"
]
shells_gest_crans = { shells_gest_crans = {
"zsh": {"path":"/bin/zsh", "desc":"Le Z SHell, shell par defaut sur zamok"}, "zsh" : {
"bash": {"path":"/bin/bash", "desc":"Le Boune-Again SHell, shell par defaut de la plupart des linux"}, "path" : "/bin/zsh",
"tcsh": {"path":"/bin/tcsh", "desc":"C SHell ++"}, "desc" : "Le Z SHell, shell par defaut sur zamok"
"screen":{"path":'/usr/bin/screen', "desc":"Un gestionnaire de fenêtre dans un terminal"}, },
"rbash": {"path":"/bin/rbash", "desc":"Un bash très restreint, voir man rbash"}, "bash" : {
"rssh": {"path":"/usr/bin/rssh", "desc":"Shell ne permetant que les transferts de fichiers via scp ou sftp"}, "path" : "/bin/bash",
"badPassSh":{"path":"/usr/local/bin/badPassSh", "desc":"Demande de changer de mot de passe à la connexion"}, "desc" : "Le Boune-Again SHell, shell par defaut de la plupart des linux"
"disconnect_shell":{"path":"/usr/local/bin/disconnect_shell", "desc":"Shell pour les suspensions de compte avec message explicatif"}, },
"tcsh" : {
"path" : "/bin/tcsh",
"desc" : "C SHell ++"
},
"screen" : {
"path" : '/usr/bin/screen',
"desc" : "Un gestionnaire de fenêtre dans un terminal"
},
"rbash" : {
"path" : "/bin/rbash",
"desc" : "Un bash très restreint, voir man rbash"
},
"rssh" : {
"path" : "/usr/bin/rssh",
"desc" : "Shell ne permetant que les transferts de fichiers via scp ou sftp"
},
"badPassSh" : {
"path" : "/usr/local/bin/badPassSh",
"desc" : "Demande de changer de mot de passe à la connexion"
},
"disconnect_shell" : {
"path" : "/usr/local/bin/disconnect_shell",
"desc" : "Shell pour les suspensions de compte avec message explicatif"
},
} }
# Quels droits donnent l'appartenance à quel groupe Unix ? # Quels droits donnent l'appartenance à quel groupe Unix ?
droits_groupes = {'adm' : [u'Nounou'], droits_groupes = {
'respbats' : [u'Imprimeur', u'Cableur', u'Nounou'], 'adm' : [
'apprentis' : [u'Apprenti'], u'Nounou',
'moderateurs' : [u'Moderateur'], ],
'disconnect' : [u'Bureau'], 'respbats' : [
'imprimeurs' : [u'Imprimeur', u'Nounou', u'Tresorier'], u'Imprimeur',
'bureau' : [u'Bureau'], u'Cableur',
'webadm' : [u'Webmaster'], u'Nounou',
'webradio' : [u'Webradio'], ],
'apprentis' : [
u'Apprenti',
],
'moderateurs' : [
u'Moderateur',
],
'disconnect' : [
u'Bureau',
],
'imprimeurs' : [
u'Imprimeur',
u'Nounou',
u'Tresorier',
],
'bureau' : [
u'Bureau',
],
'webadm' : [
u'Webmaster',
],
'webradio' : [
u'Webradio',
],
} }
####### Les modes de paiement accepté par le crans ####### Les modes de paiement accepté par le crans
modePaiement = ['liquide', 'paypal', 'solde', 'cheque', 'carte', 'comnpay', 'arbitraire', 'note'] modePaiement = [
'liquide',
'paypal',
'solde',
'cheque',
'carte',
'comnpay',
'arbitraire',
'note',
]
####### Les ML ####### Les ML
# Le + devant un nom de ML indique une synchronisation # Le + devant un nom de ML indique une synchronisation
# ML <-> fonction partielle : il n'y a pas d'effacement automatique # ML <-> fonction partielle : il n'y a pas d'effacement automatique
# des abonnés si le droit est retiré # des abonnés si le droit est retiré
droits_mailing_listes = {'roots' : [ u'Nounou', u'Apprenti'], droits_mailing_listes = {
'mailman' : [ u'Nounou'], 'roots' : [
'+nounou' : [ u'Nounou', u'Apprenti'], u'Nounou',
'respbats' : [ u'Cableur', u'Nounou', u'Bureau'], u'Apprenti',
'moderateurs' : [ u'Moderateur', u'Bureau'], ],
'disconnect' : [ u'Nounou', u'Bureau'], 'mailman' : [
'impression' : [ u'Imprimeur'], u'Nounou',
'bureau' : [u'Bureau'], ],
'tresorier' : [u'Tresorier'], '+nounou' : [
'apprentis' : [u'Apprenti'], u'Nounou',
'+ca' : [u'Bureau', u'Apprenti', u'Nounou', u'Cableur'], u'Apprenti',
],
'+federez' : [u'Bureau', u'Apprenti', u'Nounou'], 'respbats' : [
'+install-party' : [u'Bureau', u'Apprenti', u'Nounou'], u'Cableur',
u'Nounou',
u'Bureau',
],
'moderateurs' : [
u'Moderateur',
u'Bureau',
],
'disconnect' : [
u'Nounou',
u'Bureau',
],
'impression' : [
u'Imprimeur',
],
'bureau' : [
u'Bureau',
],
'tresorier' : [
u'Tresorier',
],
'apprentis' : [
u'Apprenti',
],
'+ca' : [
u'Bureau',
u'Apprenti',
u'Nounou',
u'Cableur',
],
'+federez' : [
u'Bureau',
u'Apprenti',
u'Nounou',
],
'+install-party' : [
u'Bureau',
u'Apprenti',
u'Nounou',
],
# Correspondance partielle nécessaire... Des adresses non-crans sont inscrites à ces ML. # Correspondance partielle nécessaire... Des adresses non-crans sont inscrites à ces ML.
'+dsi-crans' : [u'Nounou', u'Bureau'], '+dsi-crans' : [
'+crous-crans' : [u'Nounou', u'Bureau'], u'Nounou',
u'Bureau',
'+wrc' : [u'Webradio'], ],
'+crous-crans' : [
u'Nounou',
u'Bureau',
],
'+wrc' : [
u'Webradio',
],
} }
#: Répertoire de stockage des objets détruits #: Répertoire de stockage des objets détruits
@ -218,9 +325,16 @@ plage_ens = '138.231.0.0/16'
# clefs qui cassent la bijectivité, mais qui peuvent servir. # clefs qui cassent la bijectivité, mais qui peuvent servir.
# NETs est l'union des deux # NETs est l'union des deux
NETs_primaires = { NETs_primaires = {
'serveurs' : ['138.231.136.0/24'], 'serveurs' : [
'adherents' : ['138.231.137.0/24', '138.231.138.0/23', '138.231.140.0/22'], '138.231.136.0/24',
'wifi-adh' : ['138.231.144.0/22', ],
'adherents' : [
'138.231.137.0/24',
'138.231.138.0/23',
'138.231.140.0/22',
],
'wifi-adh' : [
'138.231.144.0/22',
'138.231.148.32/27', '138.231.148.32/27',
'138.231.148.64/26', '138.231.148.64/26',
'138.231.148.128/25', '138.231.148.128/25',
@ -230,28 +344,55 @@ NETs_primaires = {
'bornes' : [ 'bornes' : [
'138.231.148.0/27', '138.231.148.0/27',
], ],
'adm' : ['10.231.136.0/24'], 'adm' : [
'personnel-ens' : ['10.2.9.0/24'], '10.231.136.0/24'
'gratuit' : ['10.42.0.0/16'], ],
'accueil' : ['10.51.0.0/16'], 'personnel-ens' : [
'federez' : ['10.53.0.0/16'], '10.2.9.0/24'
'isolement' : ['10.52.0.0/16'], ],
'evenementiel' : ['10.231.137.0/24'], 'gratuit' : [
'multicast' : ['239.0.0.0/8'], '10.42.0.0/16'
'ens' : ['138.231.135.0/24'], ],
'accueil' : [
'10.51.0.0/16'
],
'federez' : [
'10.53.0.0/16'
],
'isolement' : [
'10.52.0.0/16'
],
'evenementiel' : [
'10.231.137.0/24'
],
'multicast' : [
'239.0.0.0/8'
],
'ens' : [
'138.231.135.0/24'
],
} }
NETs_secondaires = { NETs_secondaires = {
'all' : ['138.231.136.0/21', '138.231.144.0/21'], 'all' : [
'wifi': ['138.231.144.0/21'], '138.231.136.0/21',
'fil' : ['138.231.136.0/21'], '138.231.144.0/21',
],
'wifi': [
'138.231.144.0/21',
],
'fil' : [
'138.231.136.0/21',
],
} }
NETs = {} NETs = {}
NETs.update(NETs_primaires) NETs.update(NETs_primaires)
NETs.update(NETs_secondaires) NETs.update(NETs_secondaires)
NETs_regexp = { 'all' : '^138\.231\.1(3[6789]|4[0123456789]|5[01])\.\d+$' } NETs_regexp = {
'all' : r'^138\.231\.1(3[6789]|4[0123456789]|5[01])\.\d+$'
}
# Classes de rid # Classes de rid
# Merci d'essayer de les faire correspondre avec les réseaux # Merci d'essayer de les faire correspondre avec les réseaux
@ -320,23 +461,58 @@ ipv6_machines_speciales = {
} }
# Les préfixes ipv6 publics # Les préfixes ipv6 publics
prefix = { 'subnet' : [ '2a01:240:fe3d::/48' ], prefix = {
'serveurs' : [ '2a01:240:fe3d:4::/64' ], 'subnet' : [
'adherents' : [ '2a01:240:fe3d:4::/64' ], '2a01:240:fe3d::/48',
'fil' : [ '2a01:240:fe3d:4::/64' ], ],
'adm' : [ '2a01:240:fe3d:c804::/64' ], 'serveurs' : [
'adm-v6' : [ '2a01:240:fe3d:c804::/64' ], '2a01:240:fe3d:4::/64',
'wifi' : [ '2a01:240:fe3d:c04::/64' ], ],
'serveurs-v6' : [ '2a01:240:fe3d:c04::/64' ], 'adherents' : [
'adherents-v6' : [ '2a01:240:fe3d:4::/64' ], '2a01:240:fe3d:4::/64',
'wifi-adh-v6' : [ '2a01:240:fe3d:c04::/64' ], ],
'personnel-ens' : [ '2a01:240:fe3d:4::/64' ], 'fil' : [
'sixxs2' : [ '2a01:240:fe00:68::/64' ], '2a01:240:fe3d:4::/64',
'evenementiel' : [ '2a01:240:fe3d:d2::/64' ], ],
'bornes' : [ '2a01:240:fe3d:c04::/64' ], 'adm' : [
'bornes-v6' : [ '2a01:240:fe3d:c04::/64' ], '2a01:240:fe3d:c804::/64',
'wifi-adh' : [ '2a01:240:fe3d:c04::/64' ], ],
'v6only' : [ '2001:470:c8b9:a4::/64' ], 'adm-v6' : [
'2a01:240:fe3d:c804::/64',
],
'wifi' : [
'2a01:240:fe3d:c04::/64',
],
'serveurs-v6' : [
'2a01:240:fe3d:c04::/64',
],
'adherents-v6' : [
'2a01:240:fe3d:4::/64',
],
'wifi-adh-v6' : [
'2a01:240:fe3d:c04::/64',
],
'personnel-ens' : [
'2a01:240:fe3d:4::/64',
],
'sixxs2' : [
'2a01:240:fe00:68::/64',
],
'evenementiel' : [
'2a01:240:fe3d:d2::/64',
],
'bornes' : [
'2a01:240:fe3d:c04::/64',
],
'bornes-v6' : [
'2a01:240:fe3d:c04::/64',
],
'wifi-adh' : [
'2a01:240:fe3d:c04::/64',
],
'v6only' : [
'2001:470:c8b9:a4::/64',
],
} }
# Préfixes ipv6 internes (ula) # Préfixes ipv6 internes (ula)
@ -346,10 +522,12 @@ int_prefix = {
} }
# Domaines dans lesquels les machines sont placées suivant leur type # Domaines dans lesquels les machines sont placées suivant leur type
domains = { 'machineFixe': 'crans.org', domains = {
'machineFixe': 'crans.org',
'machineCrans': 'crans.org', 'machineCrans': 'crans.org',
'machineWifi': 'wifi.crans.org', 'machineWifi': 'wifi.crans.org',
'borneWifi': 'wifi.crans.org' } 'borneWifi': 'wifi.crans.org',
}
# VLans # VLans
vlans = { vlans = {
@ -385,30 +563,42 @@ vlans = {
'freebox': 8, 'freebox': 8,
} }
filter_policy = { 'komaz' : { 'policy_input' : 'ACCEPT', filter_policy = {
'komaz' : {
'policy_input' : 'ACCEPT',
'policy_forward' : 'ACCEPT', 'policy_forward' : 'ACCEPT',
'policy_output' : 'ACCEPT' 'policy_output' : 'ACCEPT',
}, },
'zamok' : { 'policy_input' : 'ACCEPT', 'zamok' : {
'policy_input' : 'ACCEPT',
'policy_forward' : 'DROP', 'policy_forward' : 'DROP',
'policy_output' : 'ACCEPT' 'policy_output' : 'ACCEPT',
}, },
'default' : { 'policy_input' : 'ACCEPT', 'default' : {
'policy_input' : 'ACCEPT',
'policy_forward' : 'ACCEPT', 'policy_forward' : 'ACCEPT',
'policy_output' : 'ACCEPT' 'policy_output' : 'ACCEPT',
} }
} }
# Cf RFC 4890 # Cf RFC 4890
authorized_icmpv6 = ['echo-request', 'echo-reply', 'destination-unreachable', authorized_icmpv6 = [
'packet-too-big', 'ttl-zero-during-transit', 'parameter-problem'] 'echo-request',
'echo-reply',
'destination-unreachable',
'packet-too-big',
'ttl-zero-during-transit',
'parameter-problem',
]
output_file = { 4 : '/tmp/ipt_rules', output_file = {
6 : '/tmp/ip6t_rules' 4 : '/tmp/ipt_rules',
6 : '/tmp/ip6t_rules',
} }
file_pickle = { 4 : '/tmp/ipt_pickle', file_pickle = {
6 : '/tmp/ip6t_pickle' 4 : '/tmp/ipt_pickle',
6 : '/tmp/ip6t_pickle',
} }
################################################################################## ##################################################################################
@ -447,10 +637,24 @@ blacklist_bridage_upload = ['autodisc_upload', 'upload']
################################################################################## ##################################################################################
adm_users = [ 'root', 'identd', 'daemon', 'postfix', 'freerad', 'amavis', adm_users = [
'nut', 'respbats', 'list', 'sqlgrey', 'ntpd', 'lp' ] 'root',
'identd',
'daemon',
'postfix',
'freerad',
'amavis',
'nut',
'respbats',
'list',
'sqlgrey',
'ntpd',
'lp',
]
open_ports = { 'tcp' : '22' } open_ports = {
'tcp' : '22',
}
# Debit max sur le vlan de la connexion gratuite # Debit max sur le vlan de la connexion gratuite
debit_max_radin = 1000000 debit_max_radin = 1000000
@ -460,13 +664,83 @@ debit_max_gratuit = 1000000
## Vlan accueil et isolement ## ## Vlan accueil et isolement ##
############################### ###############################
accueil_route = { accueil_route = {
'138.231.136.1':{'tcp':['80','443', '22'],'hosts':['ssh.crans.org', 'zamok.crans.org']}, '138.231.136.1' : {
'138.231.136.67':{'tcp':['80','443'],'hosts':['www.crans.org', 'wiki.crans.org', 'wifi.crans.org']}, 'tcp' : [
'138.231.136.98':{'tcp':['20','21','80','111','1024:65535'],'udp':['69','1024:65535'], 'hosts':['ftp.crans.org']}, '80',
'138.231.136.130':{'tcp':['80','443'],'hosts':['intranet2.crans.org', 'intranet.crans.org']}, '443',
'138.231.136.18':{'tcp':['80','443'],'hosts':['cas.crans.org', 'login.crans.org', 'auth.crans.org']}, '22'
'213.154.225.236':{'tcp':['80','443'], 'hosts':['crl.cacert.org']}, ],
'213.154.225.237':{'tcp':['80','443'], 'hosts':['ocsp.cacert.org']}, 'hosts' : [
'ssh.crans.org',
'zamok.crans.org',
],
},
'138.231.136.67' : {
'tcp' : [
'80',
'443',
],
'hosts' : [
'www.crans.org',
'wiki.crans.org',
'wifi.crans.org',
],
},
'138.231.136.98' : {
'tcp' : [
'20',
'21',
'80',
'111',
'1024:65535',
],
'udp' : [
'69',
'1024:65535',
],
'hosts' : [
'ftp.crans.org',
],
},
'138.231.136.130' : {
'tcp' : [
'80',
'443',
],
'hosts' : [
'intranet2.crans.org',
'intranet.crans.org',
],
},
'138.231.136.18' : {
'tcp' : [
'80',
'443',
],
'hosts' : [
'cas.crans.org',
'login.crans.org',
'auth.crans.org',
],
},
'213.154.225.236' : {
'tcp' : [
'80',
'443',
],
'hosts' : [
'crl.cacert.org',
],
},
'213.154.225.237' : {
'tcp' : [
'80',
'443',
],
'hosts' : [
'ocsp.cacert.org',
],
},
} }
dhcp_servers = ['dhcp.adm.crans.org', 'isc.adm.crans.org'] dhcp_servers = ['dhcp.adm.crans.org', 'isc.adm.crans.org']

View file

@ -21,10 +21,10 @@
import sys import sys
import os, re, syslog, cPickle, socket import os, re, syslog, cPickle, socket
from ldap_crans import crans_ldap, hostname from ldap_crans import crans_ldap, hostname, generalizedTimeFormat
from commands import getstatusoutput from commands import getstatusoutput
from config import NETs, role, prefix, rid, output_file, filter_policy, rid_primaires from config import NETs, role, prefix, rid, output_file, filter_policy, rid_primaires
from config import blacklist_sanctions, blacklist_sanctions_soft, blacklist_bridage_upload, file_pickle, ann_scol, periode_transitoire from config import blacklist_sanctions, blacklist_sanctions_soft, blacklist_bridage_upload, file_pickle, periode_transitoire, gtf_debut_periode_transitoire
from iptools import AddrInNet from iptools import AddrInNet
from ridtools import Rid, find_rid_plage from ridtools import Rid, find_rid_plage
import subprocess import subprocess
@ -768,9 +768,13 @@ def blacklist(ipt):
if [x for x in sanctions if x in blacklist_sanctions_ipv6]: if [x for x in sanctions if x in blacklist_sanctions_ipv6]:
blcklst.extend(target.machines()) blcklst.extend(target.machines())
s = db.search('mblacklist=*&paiement=%s' % ann_scol) s = db.search('mblacklist=*&finConnexion>=%(fin)s&finAdhesion>=%(fin)s' % {
'fin': generalizedTimeFormat(),
})
if periode_transitoire: if periode_transitoire:
s['machine'].extend(db.search('mblacklist=*&paiement=%s' % (ann_scol-1))['machine']) s['machine'].extend(db.search('mblacklist=*&finConnexion>=%(fin)s&finAdhsion>=%(fin)s' % {
'fin': gtf_debut_periode_transitoire,
})['machine'])
for target in s['machine']: for target in s['machine']:
sanctions = target.blacklist_actif() sanctions = target.blacklist_actif()

View file

@ -134,7 +134,6 @@ droits_vieux = [u'Nounou', u'Bureau']
### Variables internes diverses ### Variables internes diverses
#isadm = user_tests.isadm() #isadm = user_tests.isadm()
#isdeconnecteur = user_tests.isdeconnecteur() #isdeconnecteur = user_tests.isdeconnecteur()
ann_scol = config.ann_scol
#script_utilisateur = user_tests.getuser() #script_utilisateur = user_tests.getuser()
script_utilisateur = cur_user script_utilisateur = cur_user
@ -159,12 +158,15 @@ def tz(thetz):
else: else:
return "%s%04d" % ("+"*(thetz < 0) + "-"*(thetz > 0), abstz) return "%s%04d" % ("+"*(thetz < 0) + "-"*(thetz > 0), abstz)
def generalizedTimeFormat(stamp): def generalizedTimeFormat(stamp=None):
"""Converts a timestamp (local) in a generalized time format """Converts a timestamp (local) in a generalized time format
for LDAP for LDAP
""" """
if stamp is None:
stamp = time.time()
return "%s%s" % (time.strftime("%Y%m%d%H%M%S", time.localtime(stamp)), tz(time.altzone/3600)) return "%s%s" % (time.strftime("%Y%m%d%H%M%S", time.localtime(stamp)), tz(time.altzone/3600))
def fromGeneralizedTimeFormat(gtf): def fromGeneralizedTimeFormat(gtf):
@ -833,9 +835,13 @@ class CransLdap:
# définifif (cf config.py). # définifif (cf config.py).
if config.periode_transitoire: if config.periode_transitoire:
# Pour la période transitoire année précédente ok # Pour la période transitoire année précédente ok
el = "(|(paiement=%d)(paiement=%d)(finAdhesion>=%s))" % (config.ann_scol, config.ann_scol-1, generalizedTimeFormat(time.time())) el = "(&(finAdhesion>=%(fin)s)(finConnexion>=%(fin)s))" % {
'fin': config.gtf_debut_periode_transitoire,
}
else: else:
el = "(|(paiement=%s)(finAdhesion>=%s))" % (config.ann_scol, generalizedTimeFormat(time.time())) el = "(&(finAdhesion>=%(fin)s)(finConnexion>=%(fin)s))" % {
'fin': generalizedTimeFormat(),
}
# Doit-on bloquer en cas de manque de la carte d'etudiant ? # Doit-on bloquer en cas de manque de la carte d'etudiant ?
# (si période transitoire on ne bloque dans aucun cas) # (si période transitoire on ne bloque dans aucun cas)
elif champ[1:] == 'blacklist': elif champ[1:] == 'blacklist':
@ -1062,9 +1068,6 @@ class BaseClasseCrans(CransLdap):
def connexion(self, update=False, f=None): def connexion(self, update=False, f=None):
return 0.0 return 0.0
def sursis_carte(self):
return False
def chbre(self, new=None): def chbre(self, new=None):
return "????" return "????"

View file

@ -36,7 +36,6 @@ sys.path.append('/usr/scripts/gestion')
from affich_tools import tableau, cprint from affich_tools import tableau, cprint
from email_tools import send_email, parse_mail_template from email_tools import send_email, parse_mail_template
from ldap_crans import crans_ldap from ldap_crans import crans_ldap
from config import ann_scol
db = crans_ldap() db = crans_ldap()
import syslog import syslog
@ -212,7 +211,7 @@ comptes_inactifs.py
mail = nb_mails_non_lus(login) mail = nb_mails_non_lus(login)
mail = mail == None and u'?' or mail > 0 and u'X' or u' ' mail = mail == None and u'?' or mail > 0 and u'X' or u' '
ligne = (a.id(), login, a.Nom(), date, forward, mail) ligne = (a.id(), login, a.Nom(), date, forward, mail)
if ann_scol in a.paiement() or a.adhesion() > time(): if a.adhesion() > time():
inscrits.append(ligne) inscrits.append(ligne)
else: else:
anciens.append(ligne) anciens.append(ligne)

View file

@ -35,8 +35,6 @@ import gestion.config as config
import gestion.affichage as affichage import gestion.affichage as affichage
from cranslib.decorators import static_var from cranslib.decorators import static_var
from config import ann_scol
### Appels à LDAP et tri initial sur l'année en cours. ### Appels à LDAP et tri initial sur l'année en cours.
DB = shortcuts.lc_ldap_readonly() DB = shortcuts.lc_ldap_readonly()
@ -91,7 +89,7 @@ def actions_cableurs():
champ = parse_historique(histo_line)[0] champ = parse_historique(histo_line)[0]
champ_action = parse_historique(histo_line)[1] champ_action = parse_historique(histo_line)[1]
date = parse_historique(histo_line)[2] date = parse_historique(histo_line)[2]
if (u' inscription' in champ_action or u'Adhesion+' in champ_action) and date > datetime.date(ann_scol, 8, 1): if (u' inscription' in champ_action or u'Adhesion+' in champ_action) and date > datetime.date(config.ann_scol, 8, 1):
HISTORIQUE.append(champ) HISTORIQUE.append(champ)
for facture in factures(): for facture in factures():
@ -100,7 +98,7 @@ def actions_cableurs():
champ = parse_historique(histo_line)[0] champ = parse_historique(histo_line)[0]
champ_action = parse_historique(histo_line)[1] champ_action = parse_historique(histo_line)[1]
date = parse_historique(histo_line)[2] date = parse_historique(histo_line)[2]
if u'controle' in champ_action and date > datetime.date(ann_scol, 8, 1): if u'controle' in champ_action and date > datetime.date(config.ann_scol, 8, 1):
HISTORIQUE.append(champ) HISTORIQUE.append(champ)
return HISTORIQUE return HISTORIQUE
@ -139,7 +137,7 @@ def cableurs_utiles():
"""Renvoi le nombre de cableurs ayant un score non nul""" """Renvoi le nombre de cableurs ayant un score non nul"""
useless_cableurs = 0 useless_cableurs = 0
for k in range(0, len(cableurs())): for k in range(0, len(cableurs())):
if (SCORES[k][1] == 0): if SCORES[k][1] == 0:
useless_cableurs = useless_cableurs + 1 useless_cableurs = useless_cableurs + 1
return len(cableurs()) - useless_cableurs return len(cableurs()) - useless_cableurs