7
7
8
8
import requests
9
9
from core .auth import create_access_token
10
- from membership .membership import get_members_and_membership
10
+ from membership .membership import get_members_and_membership , get_membership_summaries
11
11
from membership .models import Member , Span
12
12
from messages .message import send_message
13
13
from messages .models import Message , MessageTemplate
@@ -100,13 +100,13 @@ def send_messages(key: Optional[str], domain: str, sender: str, to_override: Opt
100
100
logger .error (f"failed to send { message .id } to { to } : { response .content .decode ('utf-8' )} " )
101
101
102
102
103
- def already_sent_message (template : MessageTemplate , member : Member , days : int ) -> bool :
103
+ def already_sent_message (template : MessageTemplate , member_id : int , days : int ) -> bool :
104
104
"""True if a message has been sent with the given template to the member in the last #days days"""
105
105
now = datetime .now (timezone .utc ).replace (tzinfo = None )
106
106
reminder_sent = (
107
107
db_session .query (Message )
108
108
.filter (
109
- Message .member == member ,
109
+ Message .member_id == member_id ,
110
110
Message .template == template .value ,
111
111
now - timedelta (days = days ) < Message .created_at ,
112
112
)
@@ -142,7 +142,7 @@ def labaccess_reminder() -> None:
142
142
continue
143
143
144
144
# Don't send a reminder if we sent a reminder the last 28 days.
145
- if already_sent_message (MessageTemplate .LABACCESS_REMINDER , member , LABACCESS_REMINDER_GRACE_PERIOD ):
145
+ if already_sent_message (MessageTemplate .LABACCESS_REMINDER , member . member_id , LABACCESS_REMINDER_GRACE_PERIOD ):
146
146
continue
147
147
148
148
already_purchased = (
@@ -172,11 +172,15 @@ def labaccess_reminder() -> None:
172
172
def membership_reminder () -> None :
173
173
now = datetime .now (timezone .utc ).replace (tzinfo = None ).date ()
174
174
175
- members , memberships = get_members_and_membership ()
176
- members = list (members )
175
+ t0 = time .time ()
176
+ member_ids = db_session .scalars (select (Member .member_id ).filter (Member .deleted_at == None )).all ()
177
+
178
+ memberships = get_membership_summaries (member_ids )
179
+ t1 = time .time ()
180
+ logger .info (f"get_members_and_membership took { t1 - t0 :.2f} s" )
177
181
end_date_reminder_target = now + timedelta (days = MEMBERSHIP_REMINDER_DAYS_BEFORE )
178
182
179
- for member , membership in zip (members , memberships ):
183
+ for member_id , membership in zip (member_ids , memberships ):
180
184
if membership .membership_end is None :
181
185
# Not a member
182
186
continue
@@ -192,13 +196,14 @@ def membership_reminder() -> None:
192
196
continue
193
197
194
198
# Don't send a reminder if we sent a reminder the last 28 days.
195
- if already_sent_message (MessageTemplate .MEMBERSHIP_REMINDER , member , MEMBERSHIP_REMINDER_GRACE_PERIOD ):
199
+ if already_sent_message (MessageTemplate .MEMBERSHIP_REMINDER , member_id , MEMBERSHIP_REMINDER_GRACE_PERIOD ):
196
200
continue
197
201
198
202
already_purchased = (
199
- pending_action_value_sum (member_id = member . member_id , action_type = ProductAction .ADD_MEMBERSHIP_DAYS ) > 0
203
+ pending_action_value_sum (member_id = member_id , action_type = ProductAction .ADD_MEMBERSHIP_DAYS ) > 0
200
204
)
201
205
206
+ member = db_session .get_one (Member , member_id )
202
207
already_purchased |= member .stripe_membership_subscription_id is not None
203
208
204
209
if already_purchased :
@@ -358,8 +363,8 @@ def get_login_link(member: Member, browser: str, path: str) -> str:
358
363
description = "Dispatch emails in db send queue." , formatter_class = ArgumentDefaultsHelpFormatter
359
364
)
360
365
361
- parser .add_argument ("--sleep" , default = 4 , help = "Sleep time (in seconds) between doing ant work." )
362
- parser .add_argument ("--limit" , default = 10 , help = "Max messages to send every time checking for messages." )
366
+ parser .add_argument ("--sleep" , default = 1 , help = "Sleep time (in seconds) between doing ant work." )
367
+ parser .add_argument ("--limit" , default = 4 , help = "Max messages to send every time checking for messages." )
363
368
364
369
args = parser .parse_args ()
365
370
@@ -372,19 +377,21 @@ def get_login_link(member: Member, browser: str, path: str) -> str:
372
377
domain = config .get ("MAILGUN_DOMAIN" )
373
378
sender = config .get ("MAILGUN_FROM" )
374
379
to_override = config .get ("MAILGUN_TO_OVERRIDE" )
375
- last_quiz_check = time . time ()
380
+ last_reminder_check = 0.0
376
381
377
382
while True :
378
383
sleep (args .sleep )
379
384
try :
380
- labaccess_reminder ()
381
- membership_reminder ()
382
- if time .time () - last_quiz_check > 20 :
383
- # This check is kinda slow (takes maybe 100 ms)
384
- # so don't do it as often. It's not time critical anyway.
385
- last_quiz_check = time .time ()
385
+ if time .time () - last_reminder_check > 60 * 60 :
386
+ # These checks are kinda slow (takes a few hundred ms)
387
+ # so don't do them as often. They are not time critical anyway.
388
+ last_reminder_check = time .time ()
389
+ logger .info ("checking for reminders to send" )
390
+ labaccess_reminder ()
391
+ membership_reminder ()
386
392
quiz_reminders ()
387
- db_session .commit ()
393
+
394
+ db_session .commit ()
388
395
send_messages (key , domain , sender , to_override , args .limit )
389
396
db_session .commit ()
390
397
except DatabaseError as e :
0 commit comments