From d262481853dcb732df71e6d531457422d12bb131 Mon Sep 17 00:00:00 2001 From: ClmntBcqt <129279765+ClmntBcqt@users.noreply.github.com> Date: Wed, 24 Jul 2024 13:52:01 +0200 Subject: [PATCH] Add a check-metadata command (#36) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add a check-metadata command * add check-metadata in doc --------- Co-authored-by: Clément --- content/pages/a_page.md | 1 + jssg/management/commands/check-metadata.py | 63 ++++++++++++++++++++++ jssg/settings.py | 2 +- 3 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 jssg/management/commands/check-metadata.py diff --git a/content/pages/a_page.md b/content/pages/a_page.md index e8f4205..2db42a2 100644 --- a/content/pages/a_page.md +++ b/content/pages/a_page.md @@ -2,6 +2,7 @@ title Page1 slug page1 template_engine jinja2 +description --- { diff --git a/jssg/management/commands/check-metadata.py b/jssg/management/commands/check-metadata.py new file mode 100644 index 0000000..be037f8 --- /dev/null +++ b/jssg/management/commands/check-metadata.py @@ -0,0 +1,63 @@ +from django.core.management.base import BaseCommand +from django.conf import settings +from jssg.models import Page +from pathlib import Path + +class MetadataStatus : + + @classmethod + def get_metadata_status_for(cls, page) : + metadata_status = MetadataStatus() + metadata_status.missing = [] + metadata_status.empty = [] + for required_metadata in settings.JFME_CONTENT_REQUIRED_METADATA : + if required_metadata not in page.metadata : + metadata_status.missing.append(required_metadata) + elif page.metadata[required_metadata] == "" : + metadata_status.empty.append(required_metadata) + metadata_status.complete = (metadata_status.missing == []) and (metadata_status.empty == []) + if len(settings.JFME_CONTENT_REQUIRED_METADATA) > 0 : + metadata_status.progression = (len(settings.JFME_CONTENT_REQUIRED_METADATA) - len(metadata_status.missing) - len(metadata_status.empty)) * 100 / len(settings.JFME_CONTENT_REQUIRED_METADATA) + else : + metadata_status.progression = 100 + return metadata_status + +class Command(BaseCommand): + help = "Check if metadata in JFME_CONTENT_REQUIRED_METADATA setting are specified in pages." + + def add_arguments(self, parser): + parser.add_argument( + "--verbose", + action = "store_true", + help="Show missing or empty metadata in each page." + ) + parser.add_argument( + "content path", + nargs = "*", + type=str, + default=settings.JFME_PAGES_DIRS, + help="The paths where search the pages. Set to JFME_PAGES_DIRS by default." + ) + + def handle(self, *args, **options) : + + if settings.JFME_CONTENT_REQUIRED_METADATA == [] : + self.stdout.write(self.style.WARNING( + "Warning : no metadata specified in JFME_CONTENT_REQUIRED_METADATA setting." + )) + + for page in Page.load_glob(path = list(map(lambda p : Path(p).absolute(), options["content path"])), all = True) : + + metadata_status = MetadataStatus.get_metadata_status_for(page) + + self.stdout.write("{:3.0f}% : {}".format( + metadata_status.progression, + page.path.relative_to(page.content_page_dir)) + ) + + if options["verbosity"] > 1 or options["verbose"] : + if not metadata_status.complete : + for missing in metadata_status.missing : + self.stdout.write("\t- '%s' is missing" % missing) + for empty in metadata_status.empty : + self.stdout.write("\t- '%s' is empty" % empty) \ No newline at end of file diff --git a/jssg/settings.py b/jssg/settings.py index 71e6f44..c03e8a1 100644 --- a/jssg/settings.py +++ b/jssg/settings.py @@ -52,7 +52,7 @@ JFME_POSTS_DIRS = [path / "posts" for path in JFME_CONTENT_DIRS] JFME_TEMPLATES_DIRS = [path / "templates" for path in JFME_CONTENT_DIRS] JFME_STATIC_DIRS = [path / "static" for path in JFME_CONTENT_DIRS] - +JFME_CONTENT_REQUIRED_METADATA = ["title", "slug", "lang", "description"] # Application definition