Source code for src.share_kernel.infrastructure.base_django_repo
import uuid
from abc import abstractmethod
from typing import Generic, Type, TypeVar
from django.db import models
from src.share_kernel.domain.base_aggregate import AggregateRoot
from src.share_kernel.domain.base_repository import Repository
from src.share_kernel.domain.exceptions import EntityNotFoundException
TAggregate = TypeVar("TAggregate", bound=AggregateRoot)
TModel = TypeVar("TModel", bound=models.Model)
[docs]
class DjangoRepository(Repository[TAggregate], Generic[TAggregate, TModel]):
"""
Implémentation de base d'un repository Django.
Fournit le mapping entre le modèle Django (ORM) et l'agrégat domaine.
"""
aggregate_class: Type[TAggregate]
model_class: Type[TModel]
[docs]
def get_by_id(self, entity_id: uuid.UUID) -> TAggregate | None:
try:
model_instance = self.model_class.objects.get(pk=entity_id)
return self._to_aggregate(model_instance)
except self.model_class.DoesNotExist:
return None
[docs]
def get_by_id_or_raise(self, entity_id: uuid.UUID) -> TAggregate:
aggregate = self.get_by_id(entity_id)
if aggregate is None:
raise EntityNotFoundException(self.aggregate_class.__name__, entity_id)
return aggregate
[docs]
def save(self, entity: TAggregate) -> None:
model_instance = self._to_model(entity)
model_instance.save()
[docs]
def delete(self, entity_id: uuid.UUID) -> None:
self.model_class.objects.filter(pk=entity_id).delete()
[docs]
@abstractmethod
def _to_aggregate(self, model_instance: TModel) -> TAggregate:
"""Convertit un modèle ORM en agrégat domaine."""
raise NotImplementedError
[docs]
@abstractmethod
def _to_model(self, aggregate: TAggregate) -> TModel:
"""Convertit un agrégat domaine en modèle ORM."""
raise NotImplementedError