Collect media files together for easy serving
This commit is contained in:
parent
9c87212746
commit
caed8daeda
9 changed files with 40 additions and 1 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -176,3 +176,5 @@ pyrightconfig.json
|
|||
# End of https://www.toptal.com/developers/gitignore/api/python
|
||||
|
||||
cache/
|
||||
|
||||
/collected-content-media
|
||||
|
|
1
content/core.Page/testdir/media.txt
Normal file
1
content/core.Page/testdir/media.txt
Normal file
|
@ -0,0 +1 @@
|
|||
Imagine this is an image.
|
|
@ -3,6 +3,7 @@ title: Test
|
|||
tags:
|
||||
- tag-1
|
||||
runtime_render: false
|
||||
media: ./media.txt
|
||||
---
|
||||
|
||||
# Heading
|
|
@ -1,5 +1,5 @@
|
|||
django
|
||||
git+https://github.com/andrewgodwin/yamdl@8d34d7397f3564a550042e81ea79cca7d2f3777e
|
||||
git+https://github.com/andrewgodwin/yamdl@237d3607a8e611c723ee45a7b1726c00b1648451
|
||||
gunicorn
|
||||
markdown
|
||||
chrono
|
||||
|
|
|
@ -4,6 +4,8 @@ from django.db.models.signals import post_save
|
|||
import warnings
|
||||
from django.utils.html import strip_tags
|
||||
from django.core.management import call_command
|
||||
from django.core.files.storage import storages
|
||||
import shutil
|
||||
|
||||
|
||||
class CoreConfig(AppConfig):
|
||||
|
@ -15,6 +17,9 @@ class CoreConfig(AppConfig):
|
|||
from .models import Page
|
||||
|
||||
if not self.loaded:
|
||||
# Clear storage to ensure files are always fresh
|
||||
shutil.rmtree(storages["yamdl"].location, ignore_errors=True)
|
||||
|
||||
connection = connections["yamdl"]
|
||||
|
||||
with warnings.catch_warnings():
|
||||
|
|
|
@ -2,6 +2,11 @@ from django.db import models
|
|||
import markdown
|
||||
from django.utils.functional import cached_property
|
||||
from django.template import Template, Context
|
||||
from django.core.files.storage import storages
|
||||
from django.core.files import File
|
||||
from pathlib import Path
|
||||
import os.path
|
||||
|
||||
|
||||
class Tag(models.Model):
|
||||
__yamdl__ = True
|
||||
|
@ -11,6 +16,8 @@ class Tag(models.Model):
|
|||
|
||||
content = models.TextField()
|
||||
|
||||
def get_page_upload_to(instance, filename):
|
||||
return f"{instance._meta.verbose_name}/{instance.slug}/{os.path.basename(filename)}"
|
||||
|
||||
class Page(models.Model):
|
||||
__yamdl__ = True
|
||||
|
@ -26,6 +33,8 @@ class Page(models.Model):
|
|||
slug = models.CharField(max_length=128, unique=True, db_index=True, default=None, null=True)
|
||||
file_path = models.CharField(max_length=255)
|
||||
|
||||
media = models.FileField(null=True, default=None, storage=storages["yamdl"], upload_to=get_page_upload_to)
|
||||
|
||||
tags = models.ManyToManyField(Tag)
|
||||
|
||||
@classmethod
|
||||
|
@ -44,6 +53,11 @@ class Page(models.Model):
|
|||
"tokens": md.toc_tokens
|
||||
}
|
||||
|
||||
if data.get("media"):
|
||||
source_dir = Path(data["file_path"]).parent
|
||||
|
||||
data["media"] = File((source_dir / data["media"]).open("rb"))
|
||||
|
||||
instance = cls(**data)
|
||||
|
||||
if not instance.runtime_render:
|
||||
|
|
|
@ -144,6 +144,22 @@ USE_TZ = True
|
|||
|
||||
STATIC_URL = 'static/'
|
||||
|
||||
STORAGES = {
|
||||
"default": {
|
||||
"BACKEND": "django.core.files.storage.FileSystemStorage",
|
||||
},
|
||||
"staticfiles": {
|
||||
"BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage",
|
||||
},
|
||||
"yamdl": {
|
||||
"BACKEND": "django.core.files.storage.FileSystemStorage",
|
||||
"OPTIONS": {
|
||||
"location": BASE_DIR / "collected-content-media",
|
||||
"base_url": "/yamdl-media/"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Default primary key field type
|
||||
# https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field
|
||||
|
||||
|
|
Loading…
Reference in a new issue