Update Discourse group membership in daily cronjob

This commit is contained in:
Tanner Collin 2021-09-25 22:53:36 +00:00
parent 0b27a8bd5d
commit 6cc2b44711
2 changed files with 74 additions and 7 deletions

View File

@ -1,6 +1,7 @@
from django.core.management.base import BaseCommand, CommandError from django.core.management.base import BaseCommand, CommandError
from django.utils.timezone import now from django.utils.timezone import now
from apiserver.api import models, utils, utils_stats from django.contrib.auth.models import User
from apiserver.api import models, utils, utils_stats, utils_auth
import time import time
@ -16,6 +17,55 @@ class Command(BaseCommand):
return active_members.count() return active_members.count()
def update_discourse_groups(self):
add_to_group = {
'directors_current': [],
'protospace_members': [],
'protospace_members_former': [],
'protospace_instructors': [],
}
remove_from_group = {
'directors_current': [],
'protospace_members': [],
'protospace_members_former': [],
'protospace_members_uber': [],
'protospace_instructors': [],
}
for user in User.objects.all():
username = user.username
# handle non-member vs. member
if user.member.paused_date:
add_to_group['protospace_members_former'].append(username)
remove_from_group['directors_current'].append(username)
remove_from_group['protospace_members'].append(username)
remove_from_group['protospace_members_uber'].append(username)
remove_from_group['protospace_instructors'].append(username)
continue
else:
add_to_group['protospace_members'].append(username)
remove_from_group['protospace_members_former'].append(username)
# handle directors
if user.member.is_director:
add_to_group['directors_current'].append(username)
else:
remove_from_group['directors_current'].append(username)
# handle instructors
if user.member.is_instructor:
add_to_group['protospace_instructors'].append(username)
else:
remove_from_group['protospace_instructors'].append(username)
for group_name, usernames in add_to_group.items():
utils_auth.add_discourse_group_members(group_name, usernames)
for group_name, usernames in remove_from_group.items():
utils_auth.remove_discourse_group_members(group_name, usernames)
def handle(self, *args, **options): def handle(self, *args, **options):
self.stdout.write('{} - Beginning daily tasks'.format(str(now()))) self.stdout.write('{} - Beginning daily tasks'.format(str(now())))
@ -27,6 +77,9 @@ class Command(BaseCommand):
count = utils_stats.calc_retain_counts() count = utils_stats.calc_retain_counts()
self.stdout.write('Tallied {} retained members'.format(count)) self.stdout.write('Tallied {} retained members'.format(count))
self.update_discourse_groups()
self.stdout.write('Updated Discourse group memberships')
utils_stats.changed_card() utils_stats.changed_card()
self.stdout.write('Updated card change time') self.stdout.write('Updated card change time')

View File

@ -13,10 +13,10 @@ def discourse_is_configured():
return bool(secrets.DISCOURSE_AUTH_API_URL and secrets.AUTH_API_KEY) return bool(secrets.DISCOURSE_AUTH_API_URL and secrets.AUTH_API_KEY)
def auth_api(url, data): def auth_api(url, data=None, json=None):
try: try:
headers = {'Authorization': 'Token ' + secrets.AUTH_API_KEY} headers = {'Authorization': 'Token ' + secrets.AUTH_API_KEY}
r = requests.post(url, data=data, headers=headers, timeout=20) r = requests.post(url, data=data, json=json, headers=headers, timeout=20)
return r.status_code return r.status_code
except BaseException as e: except BaseException as e:
logger.error('Auth {} - {} - {}'.format(url, e.__class__.__name__, str(e))) logger.error('Auth {} - {} - {}'.format(url, e.__class__.__name__, str(e)))
@ -24,16 +24,30 @@ def auth_api(url, data):
def set_wiki_password(data): def set_wiki_password(data):
auth_data = dict( auth_data = dict(
username=data['username'], username=data['username'].lower(),
password=data['password'], password=data['password'],
) )
return auth_api(secrets.WIKI_AUTH_API_URL + 'set-wiki-password', auth_data) return auth_api(secrets.WIKI_AUTH_API_URL + 'set-wiki-password', data=auth_data)
def set_discourse_password(data): def set_discourse_password(data):
auth_data = dict( auth_data = dict(
username=data['username'], username=data['username'].lower(),
password=data['password'], password=data['password'],
first_name=data['first_name'], first_name=data['first_name'],
email=data['email'], email=data['email'],
) )
return auth_api(secrets.DISCOURSE_AUTH_API_URL + 'set-discourse-password', auth_data) return auth_api(secrets.DISCOURSE_AUTH_API_URL + 'set-discourse-password', data=auth_data)
def add_discourse_group_members(group_name, usernames):
json = dict(
group_name=group_name,
usernames=usernames,
)
return auth_api(secrets.DISCOURSE_AUTH_API_URL + 'add-discourse-group-members', json=json)
def remove_discourse_group_members(group_name, usernames):
json = dict(
group_name=group_name,
usernames=usernames,
)
return auth_api(secrets.DISCOURSE_AUTH_API_URL + 'remove-discourse-group-members', json=json)