From 9b365bd3b383f14c65fa77a6e2df755fb1f1dfdb Mon Sep 17 00:00:00 2001 From: Alex Coleman Date: Wed, 2 Aug 2023 19:22:18 +0000 Subject: [PATCH 1/2] turn off date parsing with PyYAML approach taken from https://stackoverflow.com/a/37958106/10651182 --- _scripts/generate_posts/generate_posts.py | 29 ++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/_scripts/generate_posts/generate_posts.py b/_scripts/generate_posts/generate_posts.py index 458e1c1..fe876d2 100644 --- a/_scripts/generate_posts/generate_posts.py +++ b/_scripts/generate_posts/generate_posts.py @@ -10,9 +10,12 @@ def main(override=False): + + NoDatesSafeLoader.remove_implicit_resolver('tag:yaml.org,2002:timestamp') + with open("_data/main.yaml", "r") as open_file: try: - data = yaml.safe_load(open_file) + data = yaml.load(open_file, Loader = NoDatesSafeLoader) except yaml.YAMLError as err: print(err) @@ -52,6 +55,30 @@ def main(override=False): return +class NoDatesSafeLoader(yaml.SafeLoader): + """ + Copied under CC-BY-SA 3.0 + https://stackoverflow.com/a/37958106/10651182 + """ + @classmethod + def remove_implicit_resolver(cls, tag_to_remove): + """ + Remove implicit resolvers for a particular tag + + Takes care not to modify resolvers in super classes. + + We want to load datetimes as strings, not dates, because we + go on to serialise as json which doesn't have the advanced types + of yaml, and leads to incompatibilities down the track. + """ + if not 'yaml_implicit_resolvers' in cls.__dict__: + cls.yaml_implicit_resolvers = cls.yaml_implicit_resolvers.copy() + + for first_letter, mappings in cls.yaml_implicit_resolvers.items(): + cls.yaml_implicit_resolvers[first_letter] = [(tag, regexp) + for tag, regexp in mappings + if tag != tag_to_remove] + if __name__ == "__main__": parser = argparse.ArgumentParser("RSE Events page post generator") From 482c8f22975f8f2e4540d36c5613dfd9c1a74fab Mon Sep 17 00:00:00 2001 From: Alex Coleman Date: Wed, 2 Aug 2023 19:23:59 +0000 Subject: [PATCH 2/2] use dateutil to flexibly parse begin field of event this allows us to more flexibly parse event dates that occur in formats like YYYY-MM-DD or YYYY-MM-DD HH:MM. This partially addresses elements in https://github.com/Sparrow0hawk/rse-calendar/issues/61 --- _scripts/generate_posts/generate_posts.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/_scripts/generate_posts/generate_posts.py b/_scripts/generate_posts/generate_posts.py index fe876d2..9f072df 100644 --- a/_scripts/generate_posts/generate_posts.py +++ b/_scripts/generate_posts/generate_posts.py @@ -4,6 +4,7 @@ import datetime import argparse import logging +from dateutil.parser import parse LOG_LEVEL = os.environ.get("LOGLEVEL") logging.basicConfig(level=LOG_LEVEL) @@ -33,12 +34,14 @@ def main(override=False): for event in data: + event_date = parse(event["begin"]) + # calculate a post end date - postEndDate = event["begin"] + datetime.timedelta(**event["duration"]) + postEndDate = event_date + datetime.timedelta(**event["duration"]) if postEndDate >= today: filename = ( - str(event["begin"].strftime("%Y-%m-%d")) + str(event_date.strftime("%Y-%m-%d")) + "-" + event["summary"].strip().replace(" ", "_") )