""" Repository for Profile model operations. """ from typing import Optional, List from django.contrib.auth.models import User from django.db.models import QuerySet from backend.core.models import Profile from backend.core.repositories.base import BaseRepository class ProfileRepository(BaseRepository[Profile]): """ Repository for Profile model operations. """ model = Profile @classmethod def get_by_user(cls, user: User) -> Optional[Profile]: """ Get a profile by user. Args: user: The user Returns: The profile or None if not found """ try: return Profile.objects.get(user=user) except Profile.DoesNotExist: return None @classmethod def get_by_email(cls, email: str) -> Optional[Profile]: """ Get a profile by email. Args: email: The email address Returns: The profile or None if not found """ return Profile.objects.filter(email=email).first() @classmethod def get_by_role(cls, role: str) -> QuerySet[Profile]: """ Get profiles by role. Args: role: The role Returns: List of profiles with the specified role """ return Profile.objects.filter(role=role) @classmethod def get_admins(cls) -> QuerySet[Profile]: """ Get all admin profiles Returns: List of admin profiles """ return cls.get_by_role('admin') @classmethod def get_team_leaders(cls) -> QuerySet[Profile]: """ Get all team leader profiles Returns: List of team leader profiles """ return cls.get_by_role('team_leader') @classmethod def get_team_members(cls) -> QuerySet[Profile]: """ Get all team member profiles Returns: List of team member profiles """ return cls.get_by_role('team_member') @classmethod def search(cls, search_term: str, search_fields: List[str] = None) -> QuerySet[Profile]: """ Search profiles by name or email. Args: search_term: The search term search_fields: List of fields to search in (optional, default fields will be used if not provided) Returns: QuerySet of matching profiles """ fields = search_fields or ['first_name', 'last_name', 'email', 'user__username', 'user__email'] return super().search(search_term, fields)