Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
12 changes: 6 additions & 6 deletions conditional/templates/include/nav.html
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<nav class="navbar fixed-top navbar-expand-lg navbar-dark bg-primary">
<div class="container">
<a class="navbar-brand" href="{{ url_for("index") }}">Packet</a>
<a class="navbar-brand" href="{{ url_for("packet_bp.index") }}">Packet</a>

<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarColor01"
aria-controls="navbarColor01" aria-expanded="false" aria-label="Toggle navigation">
Expand All @@ -11,12 +11,12 @@
<ul class="navbar-nav mr-auto">

<li class="nav-item">
<a class="nav-link" href="{{ url_for("packets") }}">Active Packets</a>
<a class="nav-link" href="{{ url_for("packet_bp.packets") }}">Active Packets</a>
</li>

{% if info.realm == "csh" %}
<li class="nav-item">
<a class="nav-link" href="{{ url_for("upperclassmen_total") }}">Signatures</a>
<a class="nav-link" href="{{ url_for("packet_bp.upperclassmen_total") }}">Signatures</a>
</li>
{% if info.admin %}
<li class="nav-item dropdown">
Expand All @@ -25,8 +25,8 @@
Admin
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
<a class="dropdown-item" href="{{ url_for("admin_freshmen") }}">Freshmen</a>
<a class="dropdown-item" href="{{ url_for("admin_packets") }}">Packets</a>
<a class="dropdown-item" href="{{ url_for("packet_bp.admin_freshmen") }}">Freshmen</a>
<a class="dropdown-item" href="{{ url_for("packet_bp.admin_packets") }}">Packets</a>
</div>
</li>
{% endif %}
Expand Down Expand Up @@ -57,7 +57,7 @@
<a class="dropdown-item" href="https://themeswitcher.csh.rit.edu/">Theme</a>
<div class="dropdown-divider"></div>
{% endif %}
<a class="dropdown-item" href="{{ url_for("logout") }}">Logout</a>
<a class="dropdown-item" href="{{ url_for("packet_bp.logout") }}">Logout</a>
</div>

</li>
Expand Down
101 changes: 94 additions & 7 deletions conditional/util/context_processors.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
# pylint: disable=bare-except

from conditional import app
from conditional.models.models import FreshmanAccount
import hashlib
import urllib
from functools import lru_cache
from datetime import datetime
from typing import Callable

from conditional import app, packet_bp
from conditional.models.models import FreshmanAccount, Freshman, UpperSignature
from conditional.util.cache import service_cache
from conditional.util.ldap import ldap_get_member, ldap_is_current_student

Expand Down Expand Up @@ -34,8 +40,89 @@ def check_current_student(username):
@app.context_processor
def utility_processor():
return {
"get_csh_name": get_csh_name,
"get_freshman_name": get_freshman_name,
"get_member_name": get_member_name,
"check_current_student": check_current_student
}
"get_csh_name": get_csh_name,
"get_freshman_name": get_freshman_name,
"get_member_name": get_member_name,
"check_current_student": check_current_student,
}


# pylint: disable=bare-except
@lru_cache(maxsize=128)
def packet_get_csh_name(username: str) -> str:
try:
member = ldap_get_member(username)
return member.cn + " (" + member.uid + ")"
except:
return username


def get_roles(sig: UpperSignature) -> dict[str, str]:
"""
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.w_m:
out["wm"] = "Wiki Maintainer"
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=256)
def get_rit_name(username: str) -> str:
try:
freshman = Freshman.query.filter_by(rit_username=username).first()
return freshman.name + " (" + username + ")"
except:
return username


# pylint: disable=bare-except
@lru_cache(maxsize=256)
def get_rit_image(username: str) -> str:
if username:
addresses = [username + "@rit.edu", username + "@g.rit.edu"]
for addr in addresses:
url = (
"https://gravatar.com/avatar/"
+ hashlib.md5(addr.encode("utf8")).hexdigest()
+ ".jpg?d=404&s=250"
)
try:
with urllib.request.urlopen(url) as gravatar:
if gravatar.getcode() == 200:
return url
except:
continue
return "https://www.gravatar.com/avatar/freshmen?d=mp&f=y"


def log_time(label: str) -> None:
"""
Used during debugging to log timestamps while rendering templates
"""
print(label, datetime.now())


@packet_bp.context_processor
def packet_utility_processor() -> dict[str, Callable]:
return {
"get_csh_name": packet_get_csh_name,
"get_rit_name": get_rit_name,
"get_rit_image": get_rit_image,
"log_time": log_time,
"get_roles": get_roles,
}
94 changes: 94 additions & 0 deletions migrations/versions/27b8305621f5_add_packet.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
"""add packet

Revision ID: 27b8305621f5
Revises: 05126dcdf40e
Create Date: 2025-09-10 09:36:50.644872

"""

# revision identifiers, used by Alembic.
revision = '27b8305621f5'
down_revision = '05126dcdf40e'

from alembic import op
import sqlalchemy as sa


def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('freshman',
sa.Column('rit_username', sa.String(length=10), nullable=False),
sa.Column('name', sa.String(length=64), nullable=False),
sa.Column('onfloor', sa.Boolean(), nullable=False),
sa.PrimaryKeyConstraint('rit_username')
)
op.create_table('notification_subscriptions',
sa.Column('member', sa.String(length=36), nullable=True),
sa.Column('freshman_username', sa.String(length=10), nullable=True),
sa.Column('token', sa.String(length=256), nullable=False),
sa.ForeignKeyConstraint(['freshman_username'], ['freshman.rit_username'], ),
sa.PrimaryKeyConstraint('token')
)
op.create_table('packet',
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('freshman_username', sa.String(length=10), nullable=True),
sa.Column('start', sa.DateTime(), nullable=False),
sa.Column('end', sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(['freshman_username'], ['freshman.rit_username'], ),
sa.PrimaryKeyConstraint('id')
)
op.create_table('signature_fresh',
sa.Column('packet_id', sa.Integer(), nullable=False),
sa.Column('freshman_username', sa.String(length=10), nullable=False),
sa.Column('signed', sa.Boolean(), nullable=False),
sa.Column('updated', sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(['freshman_username'], ['freshman.rit_username'], ),
sa.ForeignKeyConstraint(['packet_id'], ['packet.id'], ),
sa.PrimaryKeyConstraint('packet_id', 'freshman_username')
)
op.create_table('signature_misc',
sa.Column('packet_id', sa.Integer(), nullable=False),
sa.Column('member', sa.String(length=36), nullable=False),
sa.Column('updated', sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(['packet_id'], ['packet.id'], ),
sa.PrimaryKeyConstraint('packet_id', 'member')
)
op.create_table('signature_upper',
sa.Column('packet_id', sa.Integer(), nullable=False),
sa.Column('member', sa.String(length=36), nullable=False),
sa.Column('signed', sa.Boolean(), nullable=False),
sa.Column('eboard', sa.String(length=12), nullable=True),
sa.Column('active_rtp', sa.Boolean(), nullable=False),
sa.Column('three_da', sa.Boolean(), nullable=False),
sa.Column('webmaster', sa.Boolean(), nullable=False),
sa.Column('c_m', sa.Boolean(), nullable=False),
sa.Column('w_m', sa.Boolean(), nullable=False),
sa.Column('drink_admin', sa.Boolean(), nullable=False),
sa.Column('updated', sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(['packet_id'], ['packet.id'], ),
sa.PrimaryKeyConstraint('packet_id', 'member')
)
with op.batch_alter_table('freshman_accounts', schema=None) as batch_op:
batch_op.drop_column('real_signatures_missed')

with op.batch_alter_table('freshman_eval_data', schema=None) as batch_op:
batch_op.drop_column('real_signatures_missed')

# ### end Alembic commands ###


def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('freshman_eval_data', schema=None) as batch_op:
batch_op.add_column(sa.Column('real_signatures_missed', sa.INTEGER(), server_default=sa.text("'-1'::integer"), autoincrement=False, nullable=False))

with op.batch_alter_table('freshman_accounts', schema=None) as batch_op:
batch_op.add_column(sa.Column('real_signatures_missed', sa.INTEGER(), server_default=sa.text("'-1'::integer"), autoincrement=False, nullable=False))

op.drop_table('signature_upper')
op.drop_table('signature_misc')
op.drop_table('signature_fresh')
op.drop_table('packet')
op.drop_table('notification_subscriptions')
op.drop_table('freshman')
# ### end Alembic commands ###