From ba76015c71957a2a9a47e3671f0f369064e6d8d1 Mon Sep 17 00:00:00 2001 From: Sli Date: Sat, 4 Jan 2025 19:24:40 +0100 Subject: [PATCH] Use a newer ical library --- com/calendar.py | 16 ++++---- poetry.lock | 101 ++++++++++++------------------------------------ pyproject.toml | 2 +- 3 files changed, 35 insertions(+), 84 deletions(-) diff --git a/com/calendar.py b/com/calendar.py index 52cb25b9..9003d6de 100644 --- a/com/calendar.py +++ b/com/calendar.py @@ -3,10 +3,13 @@ from pathlib import Path from typing import final import urllib3 +from dateutil.relativedelta import relativedelta from django.conf import settings from django.urls import reverse from django.utils import timezone -from ics import Calendar, Event +from ical.calendar import Calendar +from ical.calendar_stream import IcsCalendarStream +from ical.event import Event from com.models import NewsDate @@ -56,19 +59,18 @@ class IcsCalendar: calendar = Calendar() for news_date in NewsDate.objects.filter( news__is_moderated=True, - end_date__gte=timezone.now() - - (timedelta(days=30) * 60), # Roughly get the last 6 months + end_date__gte=timezone.now() - (relativedelta(months=6)), ).prefetch_related("news"): event = Event( - name=news_date.news.title, - begin=news_date.start_date, + summary=news_date.news.title, + start=news_date.start_date, end=news_date.end_date, url=reverse("com:news_detail", kwargs={"news_id": news_date.news.id}), ) - calendar.events.add(event) + calendar.events.append(event) # Create a file so we can offload the download to the reverse proxy if available cls._CACHE_FOLDER.mkdir(parents=True, exist_ok=True) with open(cls._INTERNAL_CALENDAR, "wb") as f: - _ = f.write(calendar.serialize().encode("utf-8")) + _ = f.write(IcsCalendarStream.calendar_to_ics(calendar).encode("utf-8")) return cls._INTERNAL_CALENDAR diff --git a/poetry.lock b/poetry.lock index 3c4c08b0..695b4503 100644 --- a/poetry.lock +++ b/poetry.lock @@ -22,25 +22,6 @@ files = [ {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] -[[package]] -name = "arrow" -version = "1.3.0" -description = "Better dates & times for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, - {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, -] - -[package.dependencies] -python-dateutil = ">=2.7.0" -types-python-dateutil = ">=2.8.10" - -[package.extras] -doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] -test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"] - [[package]] name = "asgiref" version = "3.8.1" @@ -70,25 +51,6 @@ files = [ astroid = ["astroid (>=2,<4)"] test = ["astroid (>=2,<4)", "pytest", "pytest-cov", "pytest-xdist"] -[[package]] -name = "attrs" -version = "24.3.0" -description = "Classes Without Boilerplate" -optional = false -python-versions = ">=3.8" -files = [ - {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, - {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, -] - -[package.extras] -benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] - [[package]] name = "babel" version = "2.16.0" @@ -970,22 +932,21 @@ files = [ ] [[package]] -name = "ics" -version = "0.7.2" -description = "Python icalendar (rfc5545) parser" +name = "ical" +version = "8.3.0" +description = "Python iCalendar implementation (rfc 2445)" optional = false -python-versions = "*" +python-versions = ">=3.10" files = [ - {file = "ics-0.7.2-py2.py3-none-any.whl", hash = "sha256:5fcf4d29ec6e7dfcb84120abd617bbba632eb77b097722b7df70e48dbcf26103"}, - {file = "ics-0.7.2.tar.gz", hash = "sha256:6743539bca10391635249b87d74fcd1094af20b82098bebf7c7521df91209f05"}, + {file = "ical-8.3.0-py3-none-any.whl", hash = "sha256:606f2f561bd8b75cb726710dddbb20f3f84dfa1d6323550947dba97359423850"}, + {file = "ical-8.3.0.tar.gz", hash = "sha256:e277cc518cbb0132e6827c318c8ec3b379b125ebf0a2a44337f08795d5530937"}, ] [package.dependencies] -arrow = ">=0.11" -attrs = ">=19.1.0" -python-dateutil = "*" -six = ">1.5" -tatsu = ">4.2" +pydantic = ">=1.9.1" +pyparsing = ">=3.0.9" +python-dateutil = ">=2.8.2" +tzdata = ">=2023.3" [[package]] name = "identify" @@ -1939,6 +1900,20 @@ pyyaml = "*" [package.extras] extra = ["pygments (>=2.12)"] +[[package]] +name = "pyparsing" +version = "3.2.1" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, + {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + [[package]] name = "pytest" version = "8.3.4" @@ -2580,21 +2555,6 @@ pure-eval = "*" [package.extras] tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] -[[package]] -name = "tatsu" -version = "5.12.2" -description = "TatSu takes a grammar in a variation of EBNF as input, and outputs a memoizing PEG/Packrat parser in Python." -optional = false -python-versions = ">=3.11" -files = [ - {file = "TatSu-5.12.2-py3-none-any.whl", hash = "sha256:9c313186ae5262662cb3fbec52c9a12db1ef752e615f46cac3eb568cb91eacf9"}, - {file = "tatsu-5.12.2.tar.gz", hash = "sha256:5894dc7ddba9a1886a95ff2f06cef1be2b3d3a37c776eba8177ef4dcd80ccb03"}, -] - -[package.extras] -colorization = ["colorama"] -parproc = ["rich"] - [[package]] name = "tomli" version = "2.2.1" @@ -2651,17 +2611,6 @@ files = [ docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] -[[package]] -name = "types-python-dateutil" -version = "2.9.0.20241206" -description = "Typing stubs for python-dateutil" -optional = false -python-versions = ">=3.8" -files = [ - {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"}, - {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"}, -] - [[package]] name = "typing-extensions" version = "4.12.2" @@ -2806,4 +2755,4 @@ filelock = ">=3.4" [metadata] lock-version = "2.0" python-versions = "^3.12" -content-hash = "f0acbbe66fd99ac04891bcc8a5f28167a927e0b1f3677ebd8ab302a0e2fb9be2" +content-hash = "7f348f74a05c27e29aaaf25a5584bba9b416f42c3f370db234dd69e5e10dc8df" diff --git a/pyproject.toml b/pyproject.toml index f3427faf..3d761bca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,7 +45,7 @@ Sphinx = "^5" # Needed for building xapian tomli = "^2.2.1" django-honeypot = "^1.2.1" pydantic-extra-types = "^2.10.1" -ics = "^0.7.2" +ical = "^8.3.0" [tool.poetry.group.prod.dependencies] # deps used in prod, but unnecessary for development