Add django command for running member tally cron daily
This commit is contained in:
parent
712a6c533f
commit
8ca8970092
24
apiserver/apiserver/api/management/commands/run_daily.py
Normal file
24
apiserver/apiserver/api/management/commands/run_daily.py
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
from django.core.management.base import BaseCommand, CommandError
|
||||||
|
from apiserver.api import models, utils
|
||||||
|
|
||||||
|
import time
|
||||||
|
|
||||||
|
class Command(BaseCommand):
|
||||||
|
help = 'Tasks to run on the portal daily. 7am UTC = 12am or 1am Calgary'
|
||||||
|
|
||||||
|
def tally_active_members(self):
|
||||||
|
all_members = models.Member.objects
|
||||||
|
active_members = all_members.filter(paused_date__isnull=True)
|
||||||
|
|
||||||
|
for member in active_members:
|
||||||
|
utils.tally_membership_months(member)
|
||||||
|
|
||||||
|
return active_members.count()
|
||||||
|
|
||||||
|
|
||||||
|
def handle(self, *args, **options):
|
||||||
|
start = time.time()
|
||||||
|
count = self.tally_active_members()
|
||||||
|
self.stdout.write('Tallied {} active members in {} s'.format(
|
||||||
|
count, str(time.time() - start)
|
||||||
|
))
|
|
@ -7,8 +7,9 @@ from . import models, old_models
|
||||||
|
|
||||||
def num_months_spanned(d1, d2):
|
def num_months_spanned(d1, d2):
|
||||||
'''
|
'''
|
||||||
Return number of months thresholds two dates span.
|
Return number of month thresholds two dates span.
|
||||||
Order of arguments is same as subtraction
|
Order of arguments is same as subtraction
|
||||||
|
ie. Feb 2, Jan 29 returns 1
|
||||||
'''
|
'''
|
||||||
return (d1.year - d2.year) * 12 + d1.month - d2.month
|
return (d1.year - d2.year) * 12 + d1.month - d2.month
|
||||||
|
|
||||||
|
@ -16,13 +17,14 @@ def num_months_difference(d1, d2):
|
||||||
'''
|
'''
|
||||||
Return number of whole months between two dates.
|
Return number of whole months between two dates.
|
||||||
Order of arguments is same as subtraction
|
Order of arguments is same as subtraction
|
||||||
|
ie. Feb 2, Jan 29 returns 0
|
||||||
'''
|
'''
|
||||||
r = relativedelta.relativedelta(d1, d2)
|
r = relativedelta.relativedelta(d1, d2)
|
||||||
return r.months + 12 * r.years
|
return r.months + 12 * r.years
|
||||||
|
|
||||||
def calc_member_status(expire_date, fake_date=None):
|
def calc_member_status(expire_date, fake_date=None):
|
||||||
'''
|
'''
|
||||||
Returns the member's status and if their membership should stop
|
Return: status, if we should pause them
|
||||||
'''
|
'''
|
||||||
today = fake_date or datetime.date.today()
|
today = fake_date or datetime.date.today()
|
||||||
difference = num_months_difference(expire_date, today)
|
difference = num_months_difference(expire_date, today)
|
||||||
|
|
|
@ -95,6 +95,7 @@ for o in old:
|
||||||
new['city'] = '{}, {}'.format(o.city, o.province)
|
new['city'] = '{}, {}'.format(o.city, o.province)
|
||||||
new['old_email'] = o.email
|
new['old_email'] = o.email
|
||||||
new['is_minor'] = o.minor
|
new['is_minor'] = o.minor
|
||||||
|
new['paused_date'] = None
|
||||||
|
|
||||||
small, medium, large = None, None, None
|
small, medium, large = None, None, None
|
||||||
if str(o.id) in photo_folders:
|
if str(o.id) in photo_folders:
|
||||||
|
@ -111,40 +112,6 @@ for o in old:
|
||||||
|
|
||||||
print('Deleting all transactions...')
|
print('Deleting all transactions...')
|
||||||
models.Transaction.objects.all().delete()
|
models.Transaction.objects.all().delete()
|
||||||
print('Faking membership months...')
|
|
||||||
members = models.Member.objects.all()
|
|
||||||
bad_count = 0
|
|
||||||
|
|
||||||
for m in members:
|
|
||||||
old_status = m.status
|
|
||||||
old_expire = m.expire_date
|
|
||||||
|
|
||||||
if not m.current_start_date: continue
|
|
||||||
if 'Former' in old_status:
|
|
||||||
m.status = 'Old Portal ' + old_status
|
|
||||||
m.save()
|
|
||||||
continue
|
|
||||||
|
|
||||||
import_date = datetime.date(2020, 1, 3)
|
|
||||||
tx = utils.fake_missing_membership_months(m)
|
|
||||||
utils.tally_membership_months(m, import_date)
|
|
||||||
|
|
||||||
print(m.first_name, m.last_name, tx.memo)
|
|
||||||
|
|
||||||
if old_status != m.status or old_expire != m.expire_date:
|
|
||||||
print('Expire mismatch member:', m.__dict__)
|
|
||||||
print('New status:', m.status)
|
|
||||||
print('Old status:', old_status)
|
|
||||||
print('Old expire:', old_expire)
|
|
||||||
bad_count += 1
|
|
||||||
|
|
||||||
print('Import mismatch count:', bad_count)
|
|
||||||
|
|
||||||
print('Pausing former members...')
|
|
||||||
for m in members:
|
|
||||||
if 'Former' in m.status:
|
|
||||||
paused_date = m.expire_date or datetime.date.today()
|
|
||||||
|
|
||||||
print('Importing old transactions...')
|
print('Importing old transactions...')
|
||||||
old = old_models.Transactions.objects.using('old_portal').all()
|
old = old_models.Transactions.objects.using('old_portal').all()
|
||||||
|
|
||||||
|
@ -159,6 +126,43 @@ for o in old:
|
||||||
o.id, o.member_id, o.category
|
o.id, o.member_id, o.category
|
||||||
))
|
))
|
||||||
|
|
||||||
|
print('Faking membership months...')
|
||||||
|
members = models.Member.objects.all()
|
||||||
|
bad_count = 0
|
||||||
|
|
||||||
|
for m in members:
|
||||||
|
old_status = m.status
|
||||||
|
old_expire = m.expire_date
|
||||||
|
|
||||||
|
if 'Former' in old_status:
|
||||||
|
m.status = 'Old Portal ' + old_status
|
||||||
|
m.save()
|
||||||
|
continue
|
||||||
|
if not m.current_start_date: continue
|
||||||
|
|
||||||
|
import_date = datetime.date(2020, 1, 3)
|
||||||
|
tx = utils.fake_missing_membership_months(m)
|
||||||
|
utils.tally_membership_months(m, import_date)
|
||||||
|
|
||||||
|
print(m.first_name, m.last_name, tx.memo)
|
||||||
|
|
||||||
|
if old_status != m.status or old_expire != m.expire_date:
|
||||||
|
print('Expire / status mismatch member:', m.__dict__)
|
||||||
|
print('New status:', m.status)
|
||||||
|
print('Old status:', old_status)
|
||||||
|
print('Old expire:', old_expire)
|
||||||
|
bad_count += 1
|
||||||
|
|
||||||
|
print('Import mismatch count:', bad_count)
|
||||||
|
|
||||||
|
print('Pausing former members...')
|
||||||
|
for m in members:
|
||||||
|
if 'Former' in m.status:
|
||||||
|
paused_date = m.expire_date or datetime.date.today()
|
||||||
|
m.paused_date = paused_date
|
||||||
|
m.save()
|
||||||
|
print('Paused', m.first_name, m.last_name)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
print('Deleting all cards...')
|
print('Deleting all cards...')
|
||||||
|
|
Loading…
Reference in New Issue
Block a user