From 9d5172de415524985d0119d22ee8b6072118566a Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Tue, 26 Nov 2024 18:20:20 +0000 Subject: [PATCH] campaigns: Re-implement the donation campaign Signed-off-by: Michael Tremer --- src/backend/accounts.py | 15 +++++++++++++++ src/backend/base.py | 1 + src/backend/campaigns.py | 27 +++++++++++++++++++++++++++ src/crontab/ipfire | 3 +++ 4 files changed, 46 insertions(+) diff --git a/src/backend/accounts.py b/src/backend/accounts.py index 237bde22..d3de693d 100644 --- a/src/backend/accounts.py +++ b/src/backend/accounts.py @@ -1468,6 +1468,21 @@ class Account(LDAPObject): """, self.uid, ) + @property + def last_promotional_message_sent_at(self): + res = self.db.get(""" + SELECT + last_sent_at + FROM + account_promotional_messages + WHERE + uid = %s + """, self.uid, + ) + + if res: + return res.last_sent_at + # Messages def send_message(self, template, **kwargs): diff --git a/src/backend/base.py b/src/backend/base.py index 29b707cb..7131127e 100644 --- a/src/backend/base.py +++ b/src/backend/base.py @@ -160,6 +160,7 @@ class Backend(object): tasks = { "accounts:delete" : self.accounts._delete, "announce-blog-posts" : self.blog.announce, + "campaigns:donate" : self.campaigns.donate, "campaigns:send" : self.campaigns.send, "check-mirrors" : self.mirrors.check_all, "cleanup" : self.cleanup, diff --git a/src/backend/campaigns.py b/src/backend/campaigns.py index 9e91222c..816e02e5 100644 --- a/src/backend/campaigns.py +++ b/src/backend/campaigns.py @@ -1,5 +1,7 @@ #!/usr/bin/python3 +import datetime + from .misc import Object class Campaigns(Object): @@ -14,3 +16,28 @@ class Campaigns(Object): # Remember that we sent a promotional message if promotional: account.promotional_message_sent() + + async def donate(self): + """ + Runs the donation campain, i.e. sends an email once every two months. + """ + t = datetime.datetime.now() - datetime.timedelta(days=60) + + for account in self.backend.accounts.subscribed: + # Fall through if we have no timestamp + if account.last_promotional_message_sent_at is None: + pass + + # Fall through if we have passed the threshold + elif account.last_promotional_message_sent_at <= t: + pass + + # If nothing matched, we skip this user + else: + continue + + # Send a donation reminder + account.send_message("auth/messages/donation-reminder") + + # Remember that we sent a promotional message + account.promotional_message_sent() diff --git a/src/crontab/ipfire b/src/crontab/ipfire index b1f3584f..2ab99ac9 100644 --- a/src/crontab/ipfire +++ b/src/crontab/ipfire @@ -21,6 +21,9 @@ SHELL=/bin/bash # Toot once a day 0 8 * * * nobody sleep ${RANDOM} && ipfire.org --logging=error toot +# Donation Campaign +@hourly nobody ipfire.org --logging=error campaigns:donate + # Christmas Campaign 0 16 6 12 * nobody ipfire.org --logging=error campaigns:send donate/messages/christmas-1 0 15 17 12 * nobody ipfire.org --logging=error campaigns:send donate/messages/christmas-2 -- 2.47.2