Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
6bb3cad
Update to flask-pyoidc version 2.0.0
evelyndooley Sep 18, 2018
ee7199c
Update requirements.txt
evelyndooley Sep 19, 2018
5e05b77
Adjust message when congratualating on slack.
mxmeinhold Feb 7, 2019
9dd122a
Merge pull request #122 from mxmeinhold/congrats-adjustment
devinmatte Feb 7, 2019
c21e8bb
Remove separation of eboard
mxmeinhold Feb 7, 2019
767e417
Correct .travis.yml to pylint packet.shared
mxmeinhold Feb 7, 2019
cc7cfeb
Store CSH roles in the database
mxmeinhold Feb 7, 2019
68eb569
Add tags to the frontend
mxmeinhold Feb 15, 2019
68cad65
Add database migration for demote eboard deluxe
mxmeinhold Feb 15, 2019
13f5e7d
Merge pull request #123 from mxmeinhold/demote-eboard-deluxe
mxmeinhold Apr 4, 2019
5f22f8d
Adding Analytics
devinmatte May 1, 2019
e57ae02
Updating pylint
devinmatte May 6, 2019
ba8ce19
Correct Null error in demotion db upgrade
mxmeinhold May 27, 2019
c1c8b16
Merge pull request #127 from mxmeinhold/migration-fixes
devinmatte Jun 6, 2019
18bd35a
Merge pull request #102 from evelyndooley/develop
devinmatte Jun 12, 2019
8cbff62
Google Analytics through config
devinmatte Jun 14, 2019
ed0c6bd
Merge pull request #129 from devinmatte/develop
devinmatte Jun 14, 2019
339ecae
Bump lodash.merge from 4.6.1 to 4.6.2 (#132)
dependabot[bot] Jul 11, 2019
a12b5cb
Bump lodash.mergewith from 4.6.1 to 4.6.2 (#133)
dependabot[bot] Jul 11, 2019
46a03ad
Bump tar from 2.2.1 to 2.2.2 (#134)
dependabot[bot] Jul 11, 2019
d581edd
Upgrading all yarn packages (#135)
devinmatte Jul 11, 2019
b7612de
Updating UI, adding filters and accounting for co-ops
devinmatte Aug 5, 2019
ae5753f
Remove pylint check for lambdas
devinmatte Aug 5, 2019
e96c1c0
Dependencies and Padding Style
devinmatte Aug 5, 2019
1b46728
Updating requirements
devinmatte Aug 5, 2019
aa3462e
Updating flask pyoidc
devinmatte Aug 5, 2019
427cb8a
Fixing README badge
devinmatte Aug 5, 2019
e1fbe09
Updating javascript dependencies
devinmatte Aug 5, 2019
b055d11
Merge pull request #137 from devinmatte/develop
devinmatte Aug 5, 2019
5aa48ca
UI Cleanup and co-op support
devinmatte Aug 6, 2019
be6bc16
Checking co-ops on creation
devinmatte Aug 6, 2019
7e193d8
Fixing edge cases
devinmatte Aug 6, 2019
8df5310
Fixing line length issue
devinmatte Aug 6, 2019
e86c5f2
Removing unnecessary co_op var
devinmatte Aug 6, 2019
ef5af15
Removing co-op from all_upper
devinmatte Aug 6, 2019
6685c09
Removing co-op case
devinmatte Aug 6, 2019
e099123
Merge pull request #141 from devinmatte/develop
devinmatte Aug 6, 2019
ece3ee9
Removing co-op in packet creation
devinmatte Aug 9, 2019
353d8fb
Removing Google Analytics code
devinmatte Aug 9, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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