from typing import override from django.conf import settings from django.contrib.postgres.indexes import GinIndex from django.contrib.postgres.search import SearchVectorField from django.db import models from django.utils.translation import gettext_lazy as _ from apps.core.models import BaseModel class Learning(BaseModel): experiment = models.OneToOneField( "experiments.Experiment", on_delete=models.CASCADE, related_name="learning", verbose_name=_("experiment"), ) hypothesis = models.TextField( verbose_name=_("hypothesis"), ) findings = models.TextField( verbose_name=_("findings"), ) tags = models.JSONField( default=list, blank=True, verbose_name=_("tags"), ) context_summary = models.TextField( blank=True, verbose_name=_("context summary"), ) search_vector = SearchVectorField( null=True, blank=True, verbose_name=_("search vector"), ) created_by = models.ForeignKey( settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL, related_name="created_learnings", verbose_name=_("created by"), ) created_at = models.DateTimeField( auto_now_add=True, verbose_name=_("created at"), ) updated_at = models.DateTimeField( auto_now=True, verbose_name=_("updated at"), ) class Meta: verbose_name = _("learning") verbose_name_plural = _("learnings") ordering = ["-created_at"] indexes = [ GinIndex(fields=["search_vector"], name="idx_learning_search"), models.Index(fields=["experiment"], name="idx_learning_experiment"), ] @override def __str__(self) -> str: return f"Learning: {self.experiment.name}" class LearningEdit(BaseModel): learning = models.ForeignKey( Learning, on_delete=models.CASCADE, related_name="edits", verbose_name=_("learning"), ) edited_by = models.ForeignKey( settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL, related_name="learning_edits", verbose_name=_("edited by"), ) changes = models.JSONField( default=dict, verbose_name=_("changes"), ) created_at = models.DateTimeField( auto_now_add=True, verbose_name=_("created at"), ) class Meta: verbose_name = _("learning edit") verbose_name_plural = _("learning edits") ordering = ["-created_at"] @override def __str__(self) -> str: editor = self.edited_by.username if self.edited_by else "system" return f"Edit by {editor} on {self.learning}"