We need a name for the user when we display the members in the frontend. This commit adds the name column to the identity model. We sync the Keycloak user with the identity model when the user logs in to fill and udpate the name automatically.
186 lines
5.8 KiB
Python
186 lines
5.8 KiB
Python
# ruff: noqa: S311
|
|
"""
|
|
Core application factories
|
|
"""
|
|
from django.conf import settings
|
|
from django.contrib.auth.hashers import make_password
|
|
|
|
import factory.fuzzy
|
|
from faker import Faker
|
|
|
|
from core import models
|
|
|
|
fake = Faker()
|
|
|
|
|
|
class BaseContactFactory(factory.django.DjangoModelFactory):
|
|
"""A factory to create contacts for a user"""
|
|
|
|
class Meta:
|
|
model = models.Contact
|
|
|
|
full_name = factory.Faker("name")
|
|
short_name = factory.LazyAttributeSequence(
|
|
lambda o, n: o.full_name.split()[0] if o.full_name else f"user{n!s}"
|
|
)
|
|
|
|
data = factory.Dict(
|
|
{
|
|
"emails": factory.LazyAttribute(
|
|
lambda x: [
|
|
{
|
|
"type": fake.random_element(["Home", "Work", "Other"]),
|
|
"value": fake.email(),
|
|
}
|
|
for _ in range(fake.random_int(1, 3))
|
|
]
|
|
),
|
|
"phones": factory.LazyAttribute(
|
|
lambda x: [
|
|
{
|
|
"type": fake.random_element(
|
|
[
|
|
"Mobile",
|
|
"Home",
|
|
"Work",
|
|
"Main",
|
|
"Work Fax",
|
|
"Home Fax",
|
|
"Pager",
|
|
"Other",
|
|
]
|
|
),
|
|
"value": fake.phone_number(),
|
|
}
|
|
for _ in range(fake.random_int(1, 3))
|
|
]
|
|
),
|
|
"addresses": factory.LazyAttribute(
|
|
lambda x: [
|
|
{
|
|
"type": fake.random_element(["Home", "Work", "Other"]),
|
|
"street": fake.street_address(),
|
|
"city": fake.city(),
|
|
"state": fake.state(),
|
|
"zip": fake.zipcode(),
|
|
"country": fake.country(),
|
|
}
|
|
for _ in range(fake.random_int(1, 3))
|
|
]
|
|
),
|
|
"links": factory.LazyAttribute(
|
|
lambda x: [
|
|
{
|
|
"type": fake.random_element(
|
|
[
|
|
"Profile",
|
|
"Blog",
|
|
"Website",
|
|
"Twitter",
|
|
"Facebook",
|
|
"Instagram",
|
|
"LinkedIn",
|
|
"Other",
|
|
]
|
|
),
|
|
"value": fake.url(),
|
|
}
|
|
for _ in range(fake.random_int(1, 3))
|
|
]
|
|
),
|
|
"customFields": factory.LazyAttribute(
|
|
lambda x: {
|
|
f"custom_field_{i:d}": fake.word()
|
|
for i in range(fake.random_int(1, 3))
|
|
},
|
|
),
|
|
"organizations": factory.LazyAttribute(
|
|
lambda x: [
|
|
{
|
|
"name": fake.company(),
|
|
"department": fake.word(),
|
|
"jobTitle": fake.job(),
|
|
}
|
|
for _ in range(fake.random_int(1, 3))
|
|
]
|
|
),
|
|
}
|
|
)
|
|
|
|
|
|
class ContactFactory(BaseContactFactory):
|
|
"""A factory to create contacts for a user"""
|
|
|
|
class Meta:
|
|
model = models.Contact
|
|
|
|
base = factory.SubFactory("core.factories.ContactFactory", base=None, owner=None)
|
|
owner = factory.SubFactory("core.factories.UserFactory", profile_contact=None)
|
|
|
|
|
|
class UserFactory(factory.django.DjangoModelFactory):
|
|
"""A factory to random users for testing purposes."""
|
|
|
|
class Meta:
|
|
model = models.User
|
|
|
|
email = factory.Faker("email")
|
|
language = factory.fuzzy.FuzzyChoice([lang[0] for lang in settings.LANGUAGES])
|
|
password = make_password("password")
|
|
|
|
|
|
class IdentityFactory(factory.django.DjangoModelFactory):
|
|
"""A factory to create identities for a user"""
|
|
|
|
class Meta:
|
|
model = models.Identity
|
|
django_get_or_create = ("sub",)
|
|
|
|
user = factory.SubFactory(UserFactory)
|
|
sub = factory.Sequence(lambda n: f"user{n!s}")
|
|
email = factory.Faker("email")
|
|
name = factory.Faker("name")
|
|
|
|
|
|
class TeamFactory(factory.django.DjangoModelFactory):
|
|
"""A factory to create teams"""
|
|
|
|
class Meta:
|
|
model = models.Team
|
|
django_get_or_create = ("name",)
|
|
|
|
name = factory.Sequence(lambda n: f"team{n}")
|
|
|
|
@factory.post_generation
|
|
def users(self, create, extracted, **kwargs):
|
|
"""Add users to team from a given list of users with or without roles."""
|
|
if create and extracted:
|
|
for item in extracted:
|
|
if isinstance(item, models.User):
|
|
TeamAccessFactory(team=self, user=item)
|
|
else:
|
|
TeamAccessFactory(team=self, user=item[0], role=item[1])
|
|
|
|
|
|
class TeamAccessFactory(factory.django.DjangoModelFactory):
|
|
"""Create fake team user accesses for testing."""
|
|
|
|
class Meta:
|
|
model = models.TeamAccess
|
|
|
|
team = factory.SubFactory(TeamFactory)
|
|
user = factory.SubFactory(UserFactory)
|
|
role = factory.fuzzy.FuzzyChoice([r[0] for r in models.RoleChoices.choices])
|
|
|
|
|
|
class InvitationFactory(factory.django.DjangoModelFactory):
|
|
"""A factory to create invitations for a user"""
|
|
|
|
class Meta:
|
|
model = models.Invitation
|
|
|
|
email = factory.Faker("email")
|
|
team = factory.SubFactory(TeamFactory)
|
|
role = factory.fuzzy.FuzzyChoice([role[0] for role in models.RoleChoices.choices])
|
|
issuer = factory.SubFactory(UserFactory)
|