acm-site/acmsite/models.py
Cara Salter 5b1d41eb58
Don't key off of email for login
Let's not emulate the rest of WPI's shitty login system that doesn't
deal with name changes

This also opens us to up to making it significantly easier to update
names and emails, if they don't match on login but ID matches. Will file
bug to implement this, though it'll be hard to test

Note that this is a BREAKING CHANGE, the database will need to be
cleared before applying migrations will succeed
2024-04-06 10:20:30 +11:00

94 lines
3.2 KiB
Python

from flask import flash, redirect, url_for
from flask_login import UserMixin
from sqlalchemy import Boolean, Column, Date, DateTime, ForeignKey, Integer, String, null
import csv
from . import db
from . import login
class User(db.Model, UserMixin):
__tablename__ = "acm_users"
id = Column(String, primary_key=True)
microsoft_id = Column(String, unique=True, nullable=False)
email = Column(String, unique=True, nullable=True)
password = Column(String, nullable=False)
first_name = Column(String, nullable=False)
last_name = Column(String, nullable=False)
created = Column(DateTime, nullable=False)
last_login = Column(DateTime, nullable=False)
active = Column(Boolean, nullable=False, default=True)
is_admin = Column(Boolean, nullable=False, default=False)
def username(self):
return self.email.split("@")[0]
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
def user_loader(user_id):
return User.query.filter_by(id=user_id).first()
@login.unauthorized_handler
def unauth():
flash("Please log in first!")
return redirect("/")
class Officer(db.Model):
__tablename__ = "acm_officers"
id = Column(String, primary_key=True)
user_id = Column(String, ForeignKey('acm_users.id'), nullable=False)
term_start = Column(Date, nullable=False)
term_end = Column(Date, nullable=True)
position = Column(String, nullable=False)
def create_json(self):
return {
"id": self.id,
"user_id": self.user_id,
"term_start": self.term_start,
"term_end": self.term_end,
"position": self.position
}
class PwResetRequest(db.Model):
id = Column(String, primary_key=True)
user_id = Column(String, ForeignKey('acm_users.id'), nullable=False)
expires = Column(DateTime, nullable=False)
class Event(db.Model):
__tablename__ = "acm_events"
id = Column(String, primary_key=True)
name = Column(String, nullable=False)
description = Column(String, nullable=True)
location = Column(String, nullable=False)
start_time=Column(DateTime, nullable=False)
end_time=Column(DateTime, nullable=False)
def create_json(self):
return {
"id": self.id,
"name": self.name,
"description": self.description,
"location": self.location,
"start_time": self.start_time.isoformat(),
"end_time": self.end_time.isoformat(),
}
class Link(db.Model):
__tablename__ = "acm_links"
id = Column(String, primary_key=True)
slug = Column(String, nullable=False, unique=True)
destination = Column(String, nullable=False)
def create_json(self):
return {
"id": self.id,
"slug": self.slug,
"destination": self.destination
}