103 lines
2.5 KiB
Python
103 lines
2.5 KiB
Python
"""
|
|
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) |