Files
Lotty/src/backend/apps/learnings/models.py
T

103 lines
2.7 KiB
Python

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}"