aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.rst1
-rw-r--r--docs/source/user/settings.rst10
-rw-r--r--lesana/types.py6
-rw-r--r--tests/data/complex/settings.yaml2
-rw-r--r--tests/test_collection.py7
-rw-r--r--tests/test_types.py33
6 files changed, 58 insertions, 1 deletions
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index cab6eb1..ea33fcb 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -10,6 +10,7 @@ Unreleased
* New option default_sort for collection, to sort search results by
default.
* Added support to sort the list of all entries.
+* Add the option to autofill date and datetime fields at creation time.
0.7.0
=====
diff --git a/docs/source/user/settings.rst b/docs/source/user/settings.rst
index 7c84e39..2ef9d02 100644
--- a/docs/source/user/settings.rst
+++ b/docs/source/user/settings.rst
@@ -67,3 +67,13 @@ Some field types may add other custom properties.
you can use the ``yaml`` generic type, or write your own derivative
with an additional type).
+``date`` and ``datetime`` properties
+------------------------------------
+
+``auto``:
+ automatic manipulation of the field contents.
+
+ At the moment only the value ``creation`` is supported, to autofill
+ the field at creation time with the current UTC time (``datetime``)
+ or local zone day (``date``).
+
diff --git a/lesana/types.py b/lesana/types.py
index 0b278d6..500f21e 100644
--- a/lesana/types.py
+++ b/lesana/types.py
@@ -212,6 +212,9 @@ class LesanaDatetime(LesanaType):
)
def empty(self):
+ if self.field.get('auto', False) == 'creation':
+ return datetime.datetime.now(datetime.timezone.utc)
+
return None
@@ -236,6 +239,9 @@ class LesanaDate(LesanaType):
)
def empty(self):
+ if self.field.get('auto', False) == 'creation':
+ return datetime.date.today()
+
return None
diff --git a/tests/data/complex/settings.yaml b/tests/data/complex/settings.yaml
index 0bdcabb..1c48b52 100644
--- a/tests/data/complex/settings.yaml
+++ b/tests/data/complex/settings.yaml
@@ -41,5 +41,7 @@ fields:
sortable: true
- name: created
type: datetime
+ auto: creation
- name: epoch
type: datetime
+ auto: false
diff --git a/tests/test_collection.py b/tests/test_collection.py
index 9f83655..4fa292e 100644
--- a/tests/test_collection.py
+++ b/tests/test_collection.py
@@ -319,7 +319,12 @@ class testComplexCollection(unittest.TestCase):
self.assertIn('amount: 0', entry.yaml_data)
self.assertIn("tags: []", entry.yaml_data)
self.assertIn("exists:\n", entry.yaml_data)
- self.assertIn("created:\n", entry.yaml_data)
+ # we just check that created starts with a date and ends with
+ # the utc timezone to keep the regex short and manageable
+ self.assertRegex(
+ entry.yaml_data,
+ r"created: [\d]{4,4}-[\d]{2,2}-[\d]{2,2} .*\+00\:00"
+ )
self.assertIn("epoch:\n", entry.yaml_data)
def test_load_field_loaders(self):
diff --git a/tests/test_types.py b/tests/test_types.py
index 6f0c33e..9663288 100644
--- a/tests/test_types.py
+++ b/tests/test_types.py
@@ -176,6 +176,23 @@ class testTypes(unittest.TestCase):
v = checker.load(None)
self.assertEqual(v, None)
+ def test_datetime_auto(self):
+ field_def = self._get_field_def('datetime')
+ field_def['auto'] = 'creation'
+ checker = types.LesanaDatetime(field_def, {})
+
+ now = datetime.datetime.now()
+ v = checker.empty()
+ self.assertIsInstance(v, datetime.datetime)
+ self.assertEqual(v.tzinfo, datetime.timezone.utc)
+ self.assertEqual(v.year, now.year)
+
+ field_def['auto'] = False
+ checker = types.LesanaDatetime(field_def, {})
+
+ v = checker.empty()
+ self.assertEqual(v, None)
+
def test_date(self):
checker = types.LesanaDate(self._get_field_def('date'), {})
@@ -205,6 +222,22 @@ class testTypes(unittest.TestCase):
v = checker.load(None)
self.assertEqual(v, None)
+ def test_date_auto(self):
+ field_def = self._get_field_def('date')
+ field_def['auto'] = 'creation'
+ checker = types.LesanaDate(field_def, {})
+
+ today = datetime.date.today()
+ v = checker.empty()
+ self.assertIsInstance(v, datetime.date)
+ self.assertEqual(v, today)
+
+ field_def['auto'] = False
+ checker = types.LesanaDate(field_def, {})
+
+ v = checker.empty()
+ self.assertEqual(v, None)
+
def test_boolean(self):
checker = types.LesanaBoolean(self._get_field_def('boolean'), {})