Skip to content

Commit

Permalink
Merge pull request #139 from ComputerScienceHouse/develop
Browse files Browse the repository at this point in the history
Version 3.2
  • Loading branch information
devinmatte authored Aug 9, 2019
2 parents 3c92f55 + 353d8fb commit 822a75d
Show file tree
Hide file tree
Showing 29 changed files with 1,103 additions and 422 deletions.
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,9 @@ ENV/
# Configurations
config.py

# Setup
node_modules

# Generated Assets
packet/static/css/packet.css
*.min.css
Expand All @@ -124,3 +127,4 @@ packet/static/mstile-70x70.png
packet/static/safari-pinned-tab.svg
packet/static/site.webmanifest
faviconData.json

1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
6
3 changes: 2 additions & 1 deletion .pylintrc
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ disable =
cyclic-import,
locally-disabled,
file-ignored,
no-else-return
no-else-return,
unnecessary-lambda

[REPORTS]
output-format = text
Expand Down
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@ python:
install:
- "pip install -r requirements.txt"
script:
- "pylint packet"
- "pylint packet/routes packet"
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# CSH Web Packet

[![Python 3.6](https://img.shields.io/badge/python-3.6-blue.svg)](https://www.python.org/downloads/release/python-360/)
[![Build Status](https://travis-ci.org/ComputerScienceHouse/packet.svg?branch=develop)](https://travis-ci.org/ComputerScienceHouse/packet)
[![Build Status](https://travis-ci.com/ComputerScienceHouse/packet.svg?branch=develop)](https://travis-ci.com/ComputerScienceHouse/packet)

Packet is used by CSH to facilitate the freshmen packet portion of our introductory member evaluation process. This is
the second major iteration of packet on the web. The first version was
Expand Down
1 change: 1 addition & 0 deletions config.env.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

# Logging config
LOG_LEVEL = environ.get("PACKET_LOG_LEVEL", "INFO")
ANALYTICS_ID = environ.get("ANALYTICS_ID", "UA-420696-9")

# OpenID Connect SSO config
REALM = environ.get("PACKET_REALM", "csh")
Expand Down
34 changes: 34 additions & 0 deletions frontend/scss/components/badges.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
span {
&.badge {
font-size: 80%;
}
&.badge-eboard {
color: #fff;
background-color: #4CAF50;
}

&.badge-rtp {
color: #fff;
background-color: #ff9800;
}

&.badge-three_da {
color: #fff;
background-color: #e83e8c;
}

&.badge-webmaster {
color: #fff;
background-color: #2196F3;
}

&.badge-cm {
color: #fff;
background-color: #e51c23;
}

&.badge-drink {
color: #fff;
background-color: #b0197e;
}
}
1 change: 1 addition & 0 deletions frontend/scss/packet.scss
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@ $csh-pink: #b0197e;
@import "components/datatables";
@import "components/buttons";
@import "components/signatures";
@import "components/badges";
4 changes: 2 additions & 2 deletions frontend/scss/partials/_base.scss
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
body {
padding-top: 50px;
padding-top: 40px;
}

.main {
margin-top: 50px;
margin-top: 40px;
}

@import "global";
Expand Down
44 changes: 44 additions & 0 deletions migrations/versions/eecf30892d0e_demote_eboard_deluxe.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
"""Demote Eboard Deluxe
Revision ID: eecf30892d0e
Revises: fe83600ef3fa
Create Date: 2019-02-14 17:41:18.469840
"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = 'eecf30892d0e'
down_revision = 'fe83600ef3fa'
branch_labels = None
depends_on = None


def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('signature_upper', sa.Column('active_rtp', sa.Boolean(), nullable=False, server_default='f'))
op.add_column('signature_upper', sa.Column('c_m', sa.Boolean(), nullable=False, server_default='f'))
op.add_column('signature_upper', sa.Column('drink_admin', sa.Boolean(), nullable=False, server_default='f'))
op.add_column('signature_upper', sa.Column('three_da', sa.Boolean(), nullable=False, server_default='f'))
op.add_column('signature_upper', sa.Column('webmaster', sa.Boolean(), nullable=False, server_default='f'))
op.alter_column('signature_upper', 'eboard',
existing_type=sa.BOOLEAN(),
type_=sa.String(length=12),
nullable=True)
# ### end Alembic commands ###


def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.alter_column('signature_upper', 'eboard',
existing_type=sa.String(length=12),
type_=sa.BOOLEAN(),
nullable=False)
op.drop_column('signature_upper', 'webmaster')
op.drop_column('signature_upper', 'three_da')
op.drop_column('signature_upper', 'drink_admin')
op.drop_column('signature_upper', 'c_m')
op.drop_column('signature_upper', 'active_rtp')
# ### end Alembic commands ###
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"title": "CSH Packet",
"name": "csh-packet",
"version": "3.1.1",
"version": "3.2",
"description": "A web app implementation of the CSH introductory packet.",
"bugs": {
"url": "https://github.com/ComputerScienceHouse/packet/issues",
Expand Down
11 changes: 6 additions & 5 deletions packet/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from flask import Flask
from flask_migrate import Migrate
from flask_pyoidc.flask_pyoidc import OIDCAuthentication
from flask_pyoidc.provider_configuration import ProviderConfiguration, ClientMetadata
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
Expand Down Expand Up @@ -37,11 +38,11 @@
migrate = Migrate(app, db)
app.logger.info("SQLAlchemy pointed at " + repr(db.engine.url))

auth = OIDCAuthentication(app, issuer=app.config["OIDC_ISSUER"], client_registration_info={
"client_id": app.config["OIDC_CLIENT_ID"],
"client_secret": app.config["OIDC_CLIENT_SECRET"],
"post_logout_redirect_uris": "/logout/"
})
APP_CONFIG = ProviderConfiguration(issuer=app.config["OIDC_ISSUER"],
client_metadata=ClientMetadata(app.config["OIDC_CLIENT_ID"],
app.config["OIDC_CLIENT_SECRET"]))

auth = OIDCAuthentication({'app': APP_CONFIG}, app)

# LDAP
_ldap = csh_ldap.CSHLDAP(app.config["LDAP_BIND_DN"], app.config["LDAP_BIND_PASS"])
Expand Down
64 changes: 52 additions & 12 deletions packet/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@

from . import app, db
from .models import Freshman, Packet, FreshSignature, UpperSignature, MiscSignature
from .ldap import ldap_get_active_members, ldap_is_eboard, ldap_is_intromember
from .ldap import ldap_get_eboard_role, ldap_get_active_rtps, ldap_get_3das, ldap_get_webmasters, \
ldap_get_drink_admins, ldap_get_constitutional_maintainers, ldap_is_intromember, ldap_get_active_members, \
ldap_is_on_coop


@app.cli.command("create-secret")
Expand Down Expand Up @@ -113,7 +115,14 @@ def create_packets(freshmen_csv):
end = datetime.combine(base_date, packet_end_time) + timedelta(days=14)

print("Fetching data from LDAP...")
all_upper = list(filter(lambda member: not ldap_is_intromember(member), ldap_get_active_members()))
all_upper = list(filter(
lambda member: not ldap_is_intromember(member) and not ldap_is_on_coop(member), ldap_get_active_members()))

rtp = ldap_get_active_rtps()
three_da = ldap_get_3das()
webmaster = ldap_get_webmasters()
c_m = ldap_get_constitutional_maintainers()
drink = ldap_get_drink_admins()

# Create the new packets and the signatures for each freshman in the given CSV
freshmen_in_csv = parse_csv(freshmen_csv)
Expand All @@ -123,7 +132,14 @@ def create_packets(freshmen_csv):
db.session.add(packet)

for member in all_upper:
db.session.add(UpperSignature(packet=packet, member=member.uid, eboard=ldap_is_eboard(member)))
sig = UpperSignature(packet=packet, member=member.uid)
sig.eboard = ldap_get_eboard_role(member)
sig.active_rtp = member.uid in rtp
sig.three_da = member.uid in three_da
sig.webmaster = member.uid in webmaster
sig.c_m = member.uid in c_m
sig.drink_admin = member.uid in drink
db.session.add(sig)

for onfloor_freshman in Freshman.query.filter_by(onfloor=True).filter(Freshman.rit_username !=
freshman.rit_username).all():
Expand All @@ -139,32 +155,57 @@ def ldap_sync():
Updates the upper and misc sigs in the DB to match ldap.
"""
print("Fetching data from LDAP...")
all_upper = {member.uid: member for member in filter(lambda member: not ldap_is_intromember(member),
ldap_get_active_members())}
all_upper = {member.uid: member for member in filter(
lambda member: not ldap_is_intromember(member) and not ldap_is_on_coop(member), ldap_get_active_members())}

rtp = ldap_get_active_rtps()
three_da = ldap_get_3das()
webmaster = ldap_get_webmasters()
c_m = ldap_get_constitutional_maintainers()
drink = ldap_get_drink_admins()

print("Applying updates to the DB...")
for packet in Packet.query.filter(Packet.end > datetime.now()).all():
# Update the eboard state of all UpperSignatures
# Update the role state of all UpperSignatures
for sig in filter(lambda sig: sig.member in all_upper, packet.upper_signatures):
sig.eboard = ldap_is_eboard(all_upper[sig.member])
sig.eboard = ldap_get_eboard_role(all_upper[sig.member])
sig.active_rtp = sig.member in rtp
sig.three_da = sig.member in three_da
sig.webmaster = sig.member in webmaster
sig.c_m = sig.member in c_m
sig.drink_admin = sig.member in drink

# Migrate UpperSignatures that are from accounts that are not active anymore
for sig in filter(lambda sig: sig.member not in all_upper, packet.upper_signatures):
UpperSignature.query.filter_by(packet_id=packet.id, member=sig.member).delete()
if sig.signed:
db.session.add(MiscSignature(packet=packet, member=sig.member))
sig = MiscSignature(packet=packet, member=sig.member)
db.session.add(sig)

# Migrate MiscSignatures that are from accounts that are now active members
for sig in filter(lambda sig: sig.member in all_upper, packet.misc_signatures):
MiscSignature.query.filter_by(packet_id=packet.id, member=sig.member).delete()
db.session.add(UpperSignature(packet=packet, member=sig.member,
eboard=ldap_is_eboard(all_upper[sig.member]), signed=True))
sig = UpperSignature(packet=packet, member=sig.member, signed=True)
sig.eboard = ldap_get_eboard_role(all_upper[sig.member])
sig.active_rtp = sig.member in rtp
sig.three_da = sig.member in three_da
sig.webmaster = sig.member in webmaster
sig.c_m = sig.member in c_m
sig.drink_admin = sig.member in drink
db.session.add(sig)

# Create UpperSignatures for any new active members
# pylint: disable=cell-var-from-loop
upper_sigs = set(map(lambda sig: sig.member, packet.upper_signatures))
for member in filter(lambda member: member not in upper_sigs, all_upper):
db.session.add(UpperSignature(packet=packet, member=member, eboard=ldap_is_eboard(all_upper[member])))
UpperSignature(packet=packet, member=member)
sig.eboard = ldap_get_eboard_role(all_upper[sig.member])
sig.active_rtp = sig.member in rtp
sig.three_da = sig.member in three_da
sig.webmaster = sig.member in webmaster
sig.c_m = sig.member in c_m
sig.drink_admin = sig.member in drink
db.session.add(sig)

db.session.commit()
print("Done!")
Expand All @@ -190,7 +231,6 @@ def fetch_results():
print("\tTotal score: {:0.2f}%".format(received.total / required.total * 100))
print()

print("\tEboard: {}/{}".format(received.eboard, required.eboard))
print("\tUpperclassmen: {}/{}".format(received.upper, required.upper))
print("\tFreshmen: {}/{}".format(received.fresh, required.fresh))
print("\tMiscellaneous: {}/{}".format(received.misc, required.misc))
Expand Down
22 changes: 21 additions & 1 deletion packet/context_processors.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,26 @@ def get_csh_name(username):
except:
return username

def get_roles(sig):
"""
Converts a signature's role fields to a dict for ease of access.
:return: A dictionary of role short names to role long names
"""
out = {}
if sig.eboard:
out["eboard"] = sig.eboard
if sig.active_rtp:
out["rtp"] = "RTP"
if sig.three_da:
out["three_da"] = "3DA"
if sig.webmaster:
out["webmaster"] = "Webmaster"
if sig.c_m:
out["cm"] = "Constitutional Maintainer"
if sig.drink_admin:
out["drink"] = "Drink Admin"
return out


# pylint: disable=bare-except
@lru_cache(maxsize=128)
Expand All @@ -38,4 +58,4 @@ def log_time(label):

@app.context_processor
def utility_processor():
return dict(get_csh_name=get_csh_name, get_rit_name=get_rit_name, log_time=log_time)
return dict(get_csh_name=get_csh_name, get_rit_name=get_rit_name, log_time=log_time, get_roles=get_roles)
Loading

0 comments on commit 822a75d

Please sign in to comment.