diff --git a/canaille/commands.py b/canaille/commands.py index 94ca28f5..6b26e252 100644 --- a/canaille/commands.py +++ b/canaille/commands.py @@ -1,14 +1,14 @@ import functools -import random import sys import click from canaille import create_app -from canaille.i18n import available_language_codes from canaille.models import Group from canaille.models import User from canaille.oidc.models import AuthorizationCode from canaille.oidc.models import Token +from canaille.populate import fake_groups +from canaille.populate import fake_users from flask import current_app from flask.cli import FlaskGroup from flask.cli import with_appcontext @@ -117,25 +117,8 @@ if HAS_FAKER: # pragma: no branch """ Populate the database with generated random users. """ - from faker.config import AVAILABLE_LOCALES - locales = list(set(available_language_codes()) & set(AVAILABLE_LOCALES)) - fake = faker.Faker(locales) - for i in range(ctx.obj["number"]): - locale = random.choice(locales) - profile = fake[locale].profile() - User( - cn=profile["name"], - givenName=profile["name"].split(" ")[0], - sn=profile["name"].split(" ")[1], - uid=profile["username"], - mail=profile["mail"], - telephoneNumber=profile["ssn"], - labeledURI=profile["website"][0], - postalAddress=profile["residence"], - userPassword=fake.password(), - locale=locale, - ).save() + fake_users(ctx.obj["number"]) @populate.command() @click.pass_context @@ -151,13 +134,4 @@ if HAS_FAKER: # pragma: no branch Populate the database with generated random groups. """ - fake = faker.Faker() - users = User.all() - for i in range(ctx.obj["number"]): - group = Group( - cn=fake.unique.word(), - description=fake.sentence(), - ) - nb_users = random.randrange(1, nb_users_max + 1) - group.member = list({random.choice(users).dn for _ in range(nb_users)}) - group.save() + fake_groups(ctx.obj["number"], nb_users_max) diff --git a/canaille/populate.py b/canaille/populate.py new file mode 100644 index 00000000..8c5b441e --- /dev/null +++ b/canaille/populate.py @@ -0,0 +1,51 @@ +import random + +import faker +from canaille.i18n import available_language_codes +from canaille.models import Group +from canaille.models import User +from faker.config import AVAILABLE_LOCALES + + +def faker_generator(): + locales = list(set(available_language_codes()) & set(AVAILABLE_LOCALES)) + return faker.Faker(locales) + + +def fake_users(nb=1): + fake = faker_generator() + locale = random.choice(fake.locales) + users = list() + for _ in range(nb): + profile = fake.profile() + user = User( + cn=profile["name"], + givenName=profile["name"].split(" ")[0], + sn=profile["name"].split(" ")[1], + uid=profile["username"], + mail=profile["mail"], + telephoneNumber=profile["ssn"], + labeledURI=profile["website"][0], + postalAddress=profile["residence"], + userPassword=fake.password(), + preferredLanguage=locale, + ) + user.save() + users.append(user) + return users + + +def fake_groups(nb=1, nb_users_max=1): + fake = faker_generator() + users = User.all() + groups = list() + for _ in range(nb): + group = Group( + cn=fake.unique.word(), + description=fake.sentence(), + ) + nb_users = random.randrange(1, nb_users_max + 1) + group.member = list({random.choice(users).dn for _ in range(nb_users)}) + group.save() + groups.append(group) + return groups