diff --git a/README.md b/README.md index fc0c44b..39f9b6b 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,16 @@ flask db upgrade flask run --host 0.0.0.0 ``` +## Scheduled/Cron jobs + +Jobs that should run on a regular basis. + +### Daily + +```sh +flask event update-recurring-dates +``` + ## Administration ```sh diff --git a/project/__init__.py b/project/__init__.py index e5f59ac..a84680b 100644 --- a/project/__init__.py +++ b/project/__init__.py @@ -123,6 +123,7 @@ from project.views import ( ) # Command line +import project.cli.event import project.cli.user if __name__ == "__main__": # pragma: no cover diff --git a/project/cli/event.py b/project/cli/event.py new file mode 100644 index 0000000..5e52b4a --- /dev/null +++ b/project/cli/event.py @@ -0,0 +1,23 @@ +import click +from flask.cli import AppGroup +from project import app, db +from project.services.event import ( + get_recurring_events, + update_event_dates_with_recurrence_rule, +) + +event_cli = AppGroup("event") + + +@event_cli.command("update-recurring-dates") +def update_recurring_dates(): + events = get_recurring_events() + + for event in events: + update_event_dates_with_recurrence_rule(event) + db.session.commit() + + click.echo(f"{len(events)} event(s) where updated.") + + +app.cli.add_command(event_cli) diff --git a/project/services/event.py b/project/services/event.py index 28a4330..c4c10a9 100644 --- a/project/services/event.py +++ b/project/services/event.py @@ -122,6 +122,10 @@ def get_events_query(params): ) +def get_recurring_events(): + return Event.query.filter(Event.recurrence_rule is not None).all() + + def update_event_dates_with_recurrence_rule(event): start = event.start end = event.end diff --git a/tests/cli/test_event.py b/tests/cli/test_event.py new file mode 100644 index 0000000..a76a6ed --- /dev/null +++ b/tests/cli/test_event.py @@ -0,0 +1,7 @@ +def test_update_recurring_dates(client, seeder, app): + user_id, admin_unit_id = seeder.setup_base() + seeder.create_event(admin_unit_id, "RRULE:FREQ=DAILY;COUNT=7") + + runner = app.test_cli_runner() + result = runner.invoke(args=["event", "update-recurring-dates"]) + assert "1 event(s) where updated." in result.output diff --git a/tests/seeder.py b/tests/seeder.py index 58452c7..2402cd1 100644 --- a/tests/seeder.py +++ b/tests/seeder.py @@ -125,7 +125,7 @@ class Seeder(object): return organizer_id - def create_event(self, admin_unit_id): + def create_event(self, admin_unit_id, recurrence_rule=None): from project.models import Event from project.services.event import insert_event, upsert_event_category from project.dateutils import now @@ -139,6 +139,7 @@ class Seeder(object): event.start = now event.event_place_id = self.upsert_default_event_place(admin_unit_id) event.organizer_id = self.upsert_default_event_organizer(admin_unit_id) + event.recurrence_rule = recurrence_rule insert_event(event) self._db.session.commit() event_id = event.id