Update CLI

Add the following user commands:
- list
- autopromote

List will list all users as a table, useful for debugging things
without pulling out the database or the admin page

Autopromote will automatically promote and email users off the
waitlist until capacity is reached
This commit is contained in:
Cara Salter 2023-12-14 19:05:58 -05:00
parent 18a1dcb0d1
commit a2e640f8f7
No known key found for this signature in database
GPG key ID: A8A3A601440EADA5
3 changed files with 58 additions and 0 deletions

View file

@ -9,6 +9,8 @@ from goathacks.registration import bp
from goathacks import db, mail
from goathacks.models import User
from tabulate import tabulate
gr = AppGroup("user")
@gr.command('create')
@ -122,3 +124,56 @@ def drop_user(email, confirm):
db.session.commit()
click.echo(f"Dropped {user.first_name}'s registration")
@gr.command("list")
def list_users():
"""
Gets a list of all users
"""
users = User.query.all()
def make_table_content(user):
return [user.email, f"{user.first_name} {user.last_name}", user.waitlisted, user.is_admin]
table = map(make_table_content, users)
print(tabulate(table, headers=["Email", "Name", "Waitlisted", "Admin"]))
@gr.command("autopromote")
def autopromote_users():
"""
Runs through and automatically promotes users up to the waitlist limit
"""
WAITLIST_LIMIT = current_app.config['MAX_BEFORE_WAITLIST']
num_confirmed = db.session.query(User).filter(User.waitlisted == False).count()
click.echo(f"Got {num_confirmed} confirmed attendees")
num_waitlisted = db.session.query(User).filter(User.waitlisted == True).count()
click.echo(f"Got {num_waitlisted} waitlisted attendees")
num_to_promote = WAITLIST_LIMIT - num_confirmed
if num_to_promote > num_waitlisted:
num_to_promote = num_waitlisted
click.echo(f"About to promote {str(num_to_promote)} attendees from waitlist")
users = db.session.query(User).filter(User.waitlisted == True).all()
num_promoted = 0
num_to_promote_orig = num_to_promote
for u in users:
if num_to_promote > 0:
click.echo(f"Attempting to promote {u.email} ({u.id})")
u.waitlisted = False
db.session.commit()
msg = Message("Waitlist Promotion")
msg.add_recipient(u.email)
msg.sender = ("GoatHacks Team", "hack@wpi.edu")
msg.body = render_template("emails/waitlist_promotion.txt", user=u)
mail.send(msg)
num_promoted += 1
num_to_promote -= 1
click.echo(f"Promoted {num_promoted}/{num_to_promote_orig} attendees off the waitlist!")

View file

@ -4,6 +4,8 @@ SECRET_KEY="bad-key-change-me"
UPLOAD_FOLDER="./uploads/"
DISCORD_LINK=None
# Mail settings
MAIL_SERVER="localhost"

View file

@ -23,3 +23,4 @@ uWSGI==2.0.21
Werkzeug==2.2.2
WTForms==3.0.1
ulid
tabulate