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