MAKENTNU/web

View on GitHub
src/docs/models.py

Summary

Maintainability
A
0 mins
Test Coverage
from ckeditor_uploader.fields import RichTextUploadingField
from django.db import models
from django.utils.translation import gettext_lazy as _
from django_hosts import reverse

from users.models import User
from .validators import page_title_validator


MAIN_PAGE_TITLE = "Documentation"


class Page(models.Model):
    """Model for each individual documentation page."""
    title = models.CharField(max_length=64, unique=True, verbose_name=_("title"), validators=[page_title_validator])
    created_by = models.ForeignKey(
        to=User,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name='doc_pages_created',
    )
    current_content = models.OneToOneField(
        to='Content',
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name='page_currently_on',
    )

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('documentation_page_detail', args=[self.pk], host='docs')

    @classmethod
    def get_main_page(cls) -> 'Page':
        main_page, _created = Page.objects.get_or_create(title=MAIN_PAGE_TITLE)
        return main_page


class Content(models.Model):
    """The content of a documentation page. All versions are kept for editing history."""
    page = models.ForeignKey(
        to=Page,
        on_delete=models.CASCADE,
        related_name='content_history',
        verbose_name=_("page"),
    )
    content = RichTextUploadingField(verbose_name=_("content"))
    made_by = models.ForeignKey(
        to=User,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name='doc_page_contents_created',
        verbose_name=_("made by"),
    )
    last_modified = models.DateTimeField(auto_now=True, verbose_name=_("last modified"))

    def get_absolute_url(self):
        return reverse('documentation_page_content_detail', args=[self.page.pk, self.pk], host='docs')