Add ACM CSV export

Allows officers to easily bulk import members into ACM's web interface
This commit is contained in:
Cara Salter 2024-03-21 16:35:56 +11:00
parent 7e3d2191c6
commit 9f68d2fd47
No known key found for this signature in database
GPG key ID: A8A3A601440EADA5
3 changed files with 26 additions and 1 deletions

View file

@ -1,9 +1,10 @@
from flask import Blueprint, flash, redirect, render_template, request, url_for from flask import Blueprint, flash, redirect, render_template, request, send_file, url_for
import ulid import ulid
import datetime import datetime
from flask_login import current_user, login_required from flask_login import current_user, login_required
from acmsite.models import Link, User, Event from acmsite.models import Link, User, Event
from acmsite import models
from .forms import EventForm, LinkForm from .forms import EventForm, LinkForm
from acmsite import db from acmsite import db
@ -30,6 +31,19 @@ def users():
return render_template("admin/users.html", u_list=user_list) return render_template("admin/users.html", u_list=user_list)
@bp.route("/users.csv")
@login_required
def users_csv():
if not current_user.is_admin:
flash("Unauthorized")
return redirect(url_for('dashboard.home'))
user_list = User.query.all()
models.create_acm_csv(user_list)
return send_file('./tmp/members.csv')
@bp.route("/events") @bp.route("/events")
@login_required @login_required

View file

@ -1,6 +1,7 @@
from flask import flash, redirect, url_for from flask import flash, redirect, url_for
from flask_login import UserMixin from flask_login import UserMixin
from sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer, String, null from sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer, String, null
import csv
from . import db from . import db
from . import login from . import login
@ -16,6 +17,15 @@ class User(db.Model, UserMixin):
active = Column(Boolean, nullable=False, default=True) active = Column(Boolean, nullable=False, default=True)
is_admin = Column(Boolean, nullable=False, default=False) is_admin = Column(Boolean, nullable=False, default=False)
def create_acm_csv(user_list):
with open('acmsite/tmp/members.csv', 'w') as members_csv:
header = ['last', 'first', 'email']
writer = csv.DictWriter(members_csv, fieldnames=header)
for u in user_list:
writer.writerow({'last': u.last_name, 'first': u.first_name,
'email': u.email})
@login.user_loader @login.user_loader
def user_loader(user_id): def user_loader(user_id):
return User.query.filter_by(id=user_id).first() return User.query.filter_by(id=user_id).first()

View file

@ -2,6 +2,7 @@
{% block app_content %} {% block app_content %}
<h1>Member List</h1> <h1>Member List</h1>
<a href="{{ url_for('admin.users_csv') }}" target="_blank">CSV for ACM</a>
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<tr> <tr>