From 5aa493dbdac25962e45c75d2c67e3d732d520f36 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Fri, 4 Oct 2024 19:51:53 -0700 Subject: [PATCH] datetime filter --- src/documents/templating/filepath.py | 11 +++++ src/documents/tests/test_file_handling.py | 55 +++++++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/src/documents/templating/filepath.py b/src/documents/templating/filepath.py index 840a1b456..ec902bf54 100644 --- a/src/documents/templating/filepath.py +++ b/src/documents/templating/filepath.py @@ -2,10 +2,12 @@ import logging import os import re from collections.abc import Iterable +from datetime import datetime from pathlib import PurePath import pathvalidate from django.utils import timezone +from django.utils.dateparse import parse_date from jinja2 import StrictUndefined from jinja2 import Template from jinja2 import TemplateSyntaxError @@ -90,6 +92,15 @@ def get_cf_value( _template_environment.filters["get_cf_value"] = get_cf_value +def format_datetime(value: str | datetime, format: str) -> str: + if isinstance(value, str): + value = parse_date(value) + return value.strftime(format=format) + + +_template_environment.filters["datetime"] = format_datetime + + def create_dummy_document(): """ Create a dummy Document instance with all possible fields filled diff --git a/src/documents/tests/test_file_handling.py b/src/documents/tests/test_file_handling.py index 97163ece7..3a0700e1c 100644 --- a/src/documents/tests/test_file_handling.py +++ b/src/documents/tests/test_file_handling.py @@ -1382,3 +1382,58 @@ class TestFilenameGeneration(DirectoriesMixin, TestCase): generate_filename(doc_a), "invoices/0.pdf", ) + + def test_datetime_filter(self): + """ + GIVEN: + - Filename format with datetime filter + WHEN: + - Filepath for a document with this format is called + THEN: + - The datetime filter is rendered + """ + doc_a = Document.objects.create( + title="Some Title", + created=timezone.make_aware(datetime.datetime(2020, 6, 25, 7, 36, 51, 153)), + added=timezone.make_aware(datetime.datetime(2024, 10, 1, 7, 36, 51, 153)), + mime_type="application/pdf", + pk=2, + checksum="2", + archive_serial_number=25, + ) + + CustomField.objects.create( + name="Invoice Date", + data_type=CustomField.FieldDataType.DATE, + ) + CustomFieldInstance.objects.create( + document=doc_a, + field=CustomField.objects.get(name="Invoice Date"), + value_date=timezone.make_aware( + datetime.datetime(2024, 10, 1, 7, 36, 51, 153), + ), + ) + + with override_settings( + FILENAME_FORMAT="{{ created | datetime('%Y') }}/{{ title }}", + ): + self.assertEqual( + generate_filename(doc_a), + "2020/Some Title.pdf", + ) + + with override_settings( + FILENAME_FORMAT="{{ created | datetime('%Y-%m-%d') }}/{{ title }}", + ): + self.assertEqual( + generate_filename(doc_a), + "2020-06-25/Some Title.pdf", + ) + + with override_settings( + FILENAME_FORMAT="{{ custom_fields | get_cf_value('Invoice Date') | datetime('%Y-%m-%d') }}/{{ title }}", + ): + self.assertEqual( + generate_filename(doc_a), + "2024-10-01/Some Title.pdf", + )