185 lines
6.5 KiB
Python
185 lines
6.5 KiB
Python
from optparse import make_option
|
|
import psycopg2
|
|
import random
|
|
|
|
from django.conf import settings
|
|
from django.contrib.auth.models import User, Group
|
|
from django.core.management.base import BaseCommand, CommandError
|
|
from django.db import transaction
|
|
from django.template.defaultfilters import slugify
|
|
|
|
from docbow_project.docbow.models import MailingList, DocbowProfile
|
|
|
|
|
|
# Utilise seulement des majuscules et des chiffres, sauf i,l et 1, O et 0
|
|
__pwd_alphabet = 'ABCDEFGHJKMNPQRSTUVWXYZ23456789'
|
|
def create_password(pwd_length=8):
|
|
password = ''.join([random.choice(__pwd_alphabet)
|
|
for x in range(pwd_length)])
|
|
return password
|
|
|
|
def get_username(last_name, first_name):
|
|
username = '%s.%s' % (slugify(first_name), slugify(last_name))
|
|
return username
|
|
|
|
|
|
class Command(BaseCommand):
|
|
|
|
@transaction.commit_on_success
|
|
def handle(self, *args, **options):
|
|
verbose = (options.get('verbosity') > 1)
|
|
|
|
parl_list = MailingList.objects.get(id=settings.PARLEMENTAIRES_MAILING_ID)
|
|
ministres_list = MailingList.objects.get(id=settings.MINISTRES_MAILING_ID)
|
|
|
|
comppols = {}
|
|
|
|
conn = psycopg2.connect("host=%s dbname=%s user=%s password=%s" % (
|
|
settings.TABELLIO_DBHOST,
|
|
settings.TABELLIO_DBNAME,
|
|
settings.TABELLIO_DBUSER,
|
|
settings.TABELLIO_DBPASSWORD))
|
|
cur = conn.cursor()
|
|
|
|
cur.execute('''SELECT t_pers.nom, t_pers.prenom
|
|
FROM t_pers
|
|
WHERE t_pers.st != 'S_PARL'
|
|
AND t_pers.st != 'S_MINISTRE'
|
|
''')
|
|
|
|
while True:
|
|
t = cur.fetchone()
|
|
if not t:
|
|
break
|
|
last_name, first_name = t
|
|
|
|
username = get_username(last_name, first_name)
|
|
|
|
try:
|
|
user = User.objects.get(username=username)
|
|
except User.DoesNotExist:
|
|
continue
|
|
|
|
if not user.is_active:
|
|
continue
|
|
|
|
if verbose:
|
|
print 'disabling', username
|
|
user.is_active = False
|
|
|
|
user.save()
|
|
|
|
if user in parl_list.members.all():
|
|
parl_list.members.remove(user)
|
|
parl_list.save()
|
|
if user in ministres_list.members.all():
|
|
ministres_list.members.remove(user)
|
|
ministres_list.save()
|
|
|
|
cur.execute('''SELECT t_pers.nom, t_pers.prenom, t_adresse.email, t_comppol.abbr
|
|
FROM t_pers, t_pershistoline, t_adresse, t_comppol
|
|
WHERE t_pers.st = 'S_PARL'
|
|
AND t_pers.prenom is not NULL
|
|
AND t_pershistoline.description = t_comppol.id
|
|
AND t_pers.id = t_pershistoline.pers
|
|
AND t_pershistoline.type = 'P_CMPL'
|
|
AND t_pershistoline.fin IS NULL
|
|
AND t_adresse.email IS NOT NULL
|
|
AND (t_adresse.id = t_pers.addrpriv
|
|
OR t_adresse.id = t_pers.addrprof1
|
|
OR t_adresse.id = t_pers.addrprof2)
|
|
AND t_adresse.courriel = true''')
|
|
|
|
while True:
|
|
t = cur.fetchone()
|
|
if not t:
|
|
break
|
|
last_name, first_name, email, comppol = t
|
|
|
|
username = get_username(last_name, first_name)
|
|
|
|
user, created = User.objects.get_or_create(username=username)
|
|
user.last_name = last_name
|
|
user.first_name = first_name
|
|
user.email = email
|
|
user.is_active = True
|
|
|
|
if created:
|
|
pw = create_password()
|
|
user.set_password(pw)
|
|
if verbose:
|
|
print 'creating', username, 'with password', pw
|
|
|
|
user.save()
|
|
|
|
profile, created = DocbowProfile.objects.get_or_create(user=user)
|
|
profile.personal_email = email
|
|
|
|
if not user in parl_list.members.all():
|
|
parl_list.members.add(user)
|
|
parl_list.save()
|
|
if user in ministres_list.members.all():
|
|
ministres_list.members.remove(user)
|
|
ministres_list.save()
|
|
|
|
if not comppol in comppols:
|
|
comppols[comppol] = []
|
|
comppols[comppol].append(user)
|
|
|
|
for comppol, members in comppols.items():
|
|
maillist, created = MailingList.objects.get_or_create(
|
|
name=u'Appartenance politique - %s' % comppol)
|
|
for member in maillist.members.all():
|
|
if member not in members:
|
|
maillist.members.remove(member)
|
|
for member in members:
|
|
if member not in maillist.members.all():
|
|
maillist.members.add(member)
|
|
|
|
cur.execute('''SELECT t_pers.nom, t_pers.prenom, t_adresse.email
|
|
FROM t_pers, t_pershistoline, t_adresse
|
|
WHERE t_pers.st = 'S_MINISTRE'
|
|
AND t_pers.prenom is not NULL
|
|
AND t_pers.id = t_pershistoline.pers
|
|
AND t_pershistoline.type = 'M_MINT'
|
|
AND t_pershistoline.fin IS NULL
|
|
AND t_adresse.email IS NOT NULL
|
|
AND (t_adresse.id = t_pers.addrpriv
|
|
OR t_adresse.id = t_pers.addrprof1
|
|
OR t_adresse.id = t_pers.addrprof2)
|
|
AND t_adresse.courriel = true''')
|
|
|
|
while True:
|
|
t = cur.fetchone()
|
|
if not t:
|
|
break
|
|
last_name, first_name, email = t
|
|
|
|
username = get_username(last_name, first_name)
|
|
|
|
user, created = User.objects.get_or_create(username=username)
|
|
user.last_name = last_name
|
|
user.first_name = first_name
|
|
user.email = email
|
|
user.is_active = True
|
|
|
|
if created:
|
|
pw = create_password()
|
|
user.set_password(pw)
|
|
if verbose:
|
|
print 'creating', username, 'with password', pw
|
|
|
|
user.save()
|
|
|
|
profile, created = DocbowProfile.objects.get_or_create(user=user)
|
|
profile.personal_email = email
|
|
|
|
if user in parl_list.members.all():
|
|
parl_list.members.remove(user)
|
|
parl_list.save()
|
|
if not user in ministres_list.members.all():
|
|
ministres_list.members.add(user)
|
|
ministres_list.save()
|
|
|
|
cur.close()
|