Split populate logics in its own file

This commit is contained in:
Éloi Rivard 2023-02-26 22:21:55 +01:00
parent 055a62a6cc
commit b9704ce8f1
2 changed files with 55 additions and 30 deletions

View file

@ -1,14 +1,14 @@
import functools import functools
import random
import sys import sys
import click import click
from canaille import create_app from canaille import create_app
from canaille.i18n import available_language_codes
from canaille.models import Group from canaille.models import Group
from canaille.models import User from canaille.models import User
from canaille.oidc.models import AuthorizationCode from canaille.oidc.models import AuthorizationCode
from canaille.oidc.models import Token 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 import current_app
from flask.cli import FlaskGroup from flask.cli import FlaskGroup
from flask.cli import with_appcontext from flask.cli import with_appcontext
@ -117,25 +117,8 @@ if HAS_FAKER: # pragma: no branch
""" """
Populate the database with generated random users. Populate the database with generated random users.
""" """
from faker.config import AVAILABLE_LOCALES
locales = list(set(available_language_codes()) & set(AVAILABLE_LOCALES)) fake_users(ctx.obj["number"])
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()
@populate.command() @populate.command()
@click.pass_context @click.pass_context
@ -151,13 +134,4 @@ if HAS_FAKER: # pragma: no branch
Populate the database with generated random groups. Populate the database with generated random groups.
""" """
fake = faker.Faker() fake_groups(ctx.obj["number"], nb_users_max)
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()

51
canaille/populate.py Normal file
View file

@ -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