1
Fork 0
yamdl-playground/yamdl_playground/core/models.py

78 lines
2 KiB
Python
Raw Normal View History

2023-12-06 23:30:01 +00:00
from django.db import models
2024-03-24 21:59:25 +00:00
import markdown
2024-03-31 15:02:48 +01:00
from django.utils.functional import cached_property
2024-08-03 14:02:33 +01:00
from django.template import Template, Context
2023-12-06 23:30:01 +00:00
2024-01-10 21:59:54 +00:00
class Tag(models.Model):
__yamdl__ = True
slug = models.SlugField(max_length=128, primary_key=True)
2024-10-11 15:35:54 +01:00
file_path = models.CharField(max_length=255)
2024-01-10 21:59:54 +00:00
content = models.TextField()
2023-12-06 23:30:01 +00:00
class Page(models.Model):
__yamdl__ = True
2024-03-31 15:02:48 +01:00
_template_cache = {}
2023-12-06 23:30:01 +00:00
title = models.CharField(max_length=255)
2024-03-24 21:59:25 +00:00
raw_content = models.TextField()
2024-08-03 14:02:33 +01:00
runtime_render = models.BooleanField(default=False)
2023-12-06 23:30:01 +00:00
content = models.TextField()
2024-04-30 21:23:21 +01:00
toc = models.JSONField()
2024-01-10 21:59:54 +00:00
slug = models.CharField(max_length=128, unique=True, db_index=True, default=None, null=True)
2024-10-11 15:35:54 +01:00
file_path = models.CharField(max_length=255)
2024-01-10 21:59:54 +00:00
tags = models.ManyToManyField(Tag)
@classmethod
def from_yaml(cls, **data):
tags = data.pop("tags", None)
2024-03-24 21:59:25 +00:00
2024-04-30 21:23:21 +01:00
md = markdown.Markdown(extensions=["toc"])
2024-03-24 21:59:25 +00:00
content = data.pop("content")
data["raw_content"] = content
2024-04-30 21:23:21 +01:00
data["content"] = md.convert(content)
2024-08-03 14:02:33 +01:00
2024-04-30 21:23:21 +01:00
data["toc"] = {
"html": md.toc,
"tokens": md.toc_tokens
}
2024-03-24 21:59:25 +00:00
2024-08-03 14:02:33 +01:00
instance = cls(**data)
if not instance.runtime_render:
instance.content = instance.render_content()
instance.save()
2024-01-10 21:59:54 +00:00
if tags:
instance.tags.set(tags)
return instance
2024-03-31 15:02:48 +01:00
@cached_property
def content_template(self):
2024-08-03 14:02:33 +01:00
if self.runtime_render:
return Template(self.content, name=self.slug)
2024-03-31 15:02:48 +01:00
if (cached_template := self._template_cache.get(self.slug)) is None:
cached_template = self._template_cache[self.slug] = Template(self.content, name=self.slug)
2024-03-31 15:02:48 +01:00
return cached_template
2024-08-03 14:02:33 +01:00
def get_context(self):
return {
"page": self
}
def render_content(self, extra_context=None):
if extra_context is None:
extra_context = {}
return self.content_template.render(Context({**self.get_context(), **extra_context}))