]> git.ipfire.org Git - ipfire.org.git/commitdiff
campaigns: Re-implement the donation campaign
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 26 Nov 2024 18:20:20 +0000 (18:20 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 26 Nov 2024 18:20:20 +0000 (18:20 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/backend/accounts.py
src/backend/base.py
src/backend/campaigns.py
src/crontab/ipfire

index 237bde221ebe0bc663337f5fed650761b600f6c6..d3de693dfd2d30312193a2209acf5159239ee832 100644 (file)
@@ -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):
index 29b707cbd91fe8af7b6e12c0bc978010bea31493..7131127e1d85f6ae9dafeb041f04208f984a4624 100644 (file)
@@ -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,
index 9e91222c35d9d42945e6fda8f3ae67cfe6650556..816e02e57e4c19238f5f812b30bf2e163beb3ad4 100644 (file)
@@ -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()
index b1f3584f558387395de5cb663e56b6ac285fc9a1..2ab99ac94244e8bbadd1e0cc16488d3de021fee4 100644 (file)
@@ -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