Add ACM CSV export
Allows officers to easily bulk import members into ACM's web interface
This commit is contained in:
parent
7e3d2191c6
commit
9f68d2fd47
3 changed files with 26 additions and 1 deletions
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Add table
Reference in a new issue