docbow/docbow_project/docbow/management/commands/sync-tabellio.py

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()