From 952bbde73cf9ae78e8e3dc874502629bfbdb2405 Mon Sep 17 00:00:00 2001 From: Adrian Edwards <17362949+MoralCode@users.noreply.github.com> Date: Tue, 8 Oct 2019 08:48:16 -0400 Subject: [PATCH 1/5] add the persons name to the packet confirmation screen --- packet/static/js/signing.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packet/static/js/signing.js b/packet/static/js/signing.js index 90855808..40b3872c 100644 --- a/packet/static/js/signing.js +++ b/packet/static/js/signing.js @@ -13,7 +13,7 @@ $(document).ready(function () { var userData = $("#userInfo").val(); dialogs.fire({ title: "Are you sure?", - text: "Once a packet is signed it can only be unsigned from request to the Evals Director", + text: "Once " + packetData.freshman_name + "'s packet is signed it can only be unsigned from request to the Evals Director", type: "warning", confirmButtonText: 'Sign', showCancelButton: true, From 4c2a4bf97ce2ca4ffdbad78c22dc948b2e9cab21 Mon Sep 17 00:00:00 2001 From: Max Meinhold Date: Tue, 8 Oct 2019 16:03:21 -0400 Subject: [PATCH 2/5] Packet GET routes for Conditional (#185) * Create `packets/{username}` route * Create `/packet/{packet_id}` route * Create newest packet by user route * Remove superflous `as_dict()` * Remove extra `beforerequest`s * Correct for pylint * Correct GET capitalization * Replace as_dict() with vars() again --- packet/models.py | 7 +++++++ packet/routes/api.py | 50 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/packet/models.py b/packet/models.py index b251661c..dc60d570 100644 --- a/packet/models.py +++ b/packet/models.py @@ -42,6 +42,13 @@ class Freshman(db.Model): # One freshman can have multiple packets if they repeat the intro process packets = relationship("Packet", order_by="desc(Packet.id)") + @classmethod + def by_username(cls, username: str): + """ + Helper method to retrieve a freshman by their RIT username + """ + return cls.query.filter_by(rit_username=username).first() + class Packet(db.Model): __tablename__ = "packet" diff --git a/packet/routes/api.py b/packet/routes/api.py index 5f576117..1b48c99f 100644 --- a/packet/routes/api.py +++ b/packet/routes/api.py @@ -7,10 +7,58 @@ from packet.context_processors import get_rit_name from packet.mail import send_report_mail from packet.utils import before_request, packet_auth, notify_slack -from packet.models import Packet, MiscSignature, NotificationSubscription +from packet.models import Packet, MiscSignature, NotificationSubscription, Freshman from packet.notifications import packet_signed_notification, packet_100_percent_notification +@app.route("/api/v1/packets/", methods=["GET"]) +@packet_auth +def get_packets_by_user(username: str) -> dict: + """ + Return a dictionary of packets for a freshman by username, giving packet start and end date by packet id + """ + frosh = Freshman.by_username(username) + + return {packet.id: { + 'start': packet.start, + 'end': packet.end, + } for packet in frosh.packets} + + +@app.route("/api/v1/packets//newest", methods=["GET"]) +@packet_auth +def get_newest_packet_by_user(username: str) -> dict: + """ + Return a user's newest packet + """ + frosh = Freshman.by_username(username) + + packet = frosh.packets[-1] + + return { + packet.id: { + 'start': packet.start, + 'end': packet.end, + 'required': vars(packet.signatures_required()), + 'received': vars(packet.signatures_received()), + } + } + + +@app.route("/api/v1/packet/", methods=["GET"]) +@packet_auth +def get_packet_by_id(packet_id: int) -> dict: + """ + Return the scores of the packet in question + """ + + packet = Packet.by_id(packet_id) + + return { + 'required': vars(packet.signatures_required()), + 'received': vars(packet.signatures_received()), + } + @app.route("/api/v1/sign//", methods=["POST"]) @packet_auth @before_request From 4b8cdde9886bc8a88a2dd5d61c05e720edd0a534 Mon Sep 17 00:00:00 2001 From: Max Meinhold Date: Tue, 8 Oct 2019 00:38:39 -0400 Subject: [PATCH 3/5] Add quote formatting to pylint config I just love getting a 5 running pylint --- .pylintrc | 3 +++ .travis.yml | 2 +- requirements.txt | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.pylintrc b/.pylintrc index cd54984b..a250c48e 100644 --- a/.pylintrc +++ b/.pylintrc @@ -30,6 +30,9 @@ single-line-if-stmt = no no-space-check = trailing-comma,dict-separator max-module-lines = 1000 indent-string = ' ' +string-quote=single-avoid-escape +triple-quote=single +docstring-quote=double [MISCELLANEOUS] notes = FIXME,XXX,TODO diff --git a/.travis.yml b/.travis.yml index 666c103f..3490afa5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,4 +5,4 @@ python: install: - "pip install -r requirements.txt" script: - - "pylint packet/routes packet" + - "pylint --load-plugins pylint_quotes packet/routes packet" diff --git a/requirements.txt b/requirements.txt index 12adcdc3..5687c98f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,3 +9,4 @@ pylint~=2.3.1 gunicorn~=19.7.1 csh_ldap~=2.1.0 onesignal-sdk~=1.0.0 +pylint-quotes~=0.2.1 From 7d7aacf9db3e7e1c2abffb16efca4334f97f7e38 Mon Sep 17 00:00:00 2001 From: Max Meinhold Date: Tue, 8 Oct 2019 14:57:02 -0400 Subject: [PATCH 4/5] Conform quote style to pylint --- packet/__init__.py | 42 +++++++-------- packet/commands.py | 96 +++++++++++++++++----------------- packet/context_processors.py | 22 ++++---- packet/ldap.py | 72 ++++++++++++------------- packet/log_utils.py | 6 +-- packet/mail.py | 36 ++++++------- packet/models.py | 50 +++++++++--------- packet/notifications.py | 44 ++++++++-------- packet/routes/api.py | 50 +++++++++--------- packet/routes/freshmen.py | 6 +-- packet/routes/shared.py | 22 ++++---- packet/routes/upperclassmen.py | 12 ++--- packet/utils.py | 34 ++++++------ 13 files changed, 246 insertions(+), 246 deletions(-) diff --git a/packet/__init__.py b/packet/__init__.py index 2fe64b94..25189c44 100644 --- a/packet/__init__.py +++ b/packet/__init__.py @@ -20,47 +20,47 @@ # Load default configuration and any environment variable overrides _root_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) -app.config.from_pyfile(os.path.join(_root_dir, "config.env.py")) +app.config.from_pyfile(os.path.join(_root_dir, 'config.env.py')) # Load file based configuration overrides if present -_pyfile_config = os.path.join(_root_dir, "config.py") +_pyfile_config = os.path.join(_root_dir, 'config.py') if os.path.exists(_pyfile_config): app.config.from_pyfile(_pyfile_config) # Fetch the version number from the npm package file -with open(os.path.join(_root_dir, "package.json")) as package_file: - app.config["VERSION"] = json.load(package_file)["version"] +with open(os.path.join(_root_dir, 'package.json')) as package_file: + app.config['VERSION'] = json.load(package_file)['version'] # Logger configuration -logging.getLogger().setLevel(app.config["LOG_LEVEL"]) -app.logger.info("Launching packet v" + app.config["VERSION"]) -app.logger.info("Using the {} realm".format(app.config["REALM"])) +logging.getLogger().setLevel(app.config['LOG_LEVEL']) +app.logger.info('Launching packet v' + app.config['VERSION']) +app.logger.info('Using the {} realm'.format(app.config['REALM'])) # Initialize the extensions db = SQLAlchemy(app) migrate = Migrate(app, db) -app.logger.info("SQLAlchemy pointed at " + repr(db.engine.url)) +app.logger.info('SQLAlchemy pointed at ' + repr(db.engine.url)) -APP_CONFIG = ProviderConfiguration(issuer=app.config["OIDC_ISSUER"], - client_metadata=ClientMetadata(app.config["OIDC_CLIENT_ID"], - app.config["OIDC_CLIENT_SECRET"])) +APP_CONFIG = ProviderConfiguration(issuer=app.config['OIDC_ISSUER'], + client_metadata=ClientMetadata(app.config['OIDC_CLIENT_ID'], + app.config['OIDC_CLIENT_SECRET'])) # Initialize Onesignal Notification apps -csh_onesignal_client = onesignal.Client(user_auth_key=app.config["ONESIGNAL_USER_AUTH_KEY"], - app_auth_key=app.config["ONESIGNAL_CSH_APP_AUTH_KEY"], - app_id=app.config["ONESIGNAL_CSH_APP_ID"]) +csh_onesignal_client = onesignal.Client(user_auth_key=app.config['ONESIGNAL_USER_AUTH_KEY'], + app_auth_key=app.config['ONESIGNAL_CSH_APP_AUTH_KEY'], + app_id=app.config['ONESIGNAL_CSH_APP_ID']) -intro_onesignal_client = onesignal.Client(user_auth_key=app.config["ONESIGNAL_USER_AUTH_KEY"], - app_auth_key=app.config["ONESIGNAL_INTRO_APP_AUTH_KEY"], - app_id=app.config["ONESIGNAL_INTRO_APP_ID"]) +intro_onesignal_client = onesignal.Client(user_auth_key=app.config['ONESIGNAL_USER_AUTH_KEY'], + app_auth_key=app.config['ONESIGNAL_INTRO_APP_AUTH_KEY'], + app_id=app.config['ONESIGNAL_INTRO_APP_ID']) # OIDC Auth auth = OIDCAuthentication({'app': APP_CONFIG}, app) # LDAP -_ldap = csh_ldap.CSHLDAP(app.config["LDAP_BIND_DN"], app.config["LDAP_BIND_PASS"]) +_ldap = csh_ldap.CSHLDAP(app.config['LDAP_BIND_DN'], app.config['LDAP_BIND_PASS']) -app.logger.info("OIDCAuth and LDAP configured") +app.logger.info('OIDCAuth and LDAP configured') # pylint: disable=wrong-import-position from . import models @@ -68,9 +68,9 @@ from . import commands from .routes import api, shared -if app.config["REALM"] == "csh": +if app.config['REALM'] == 'csh': from .routes import upperclassmen else: from .routes import freshmen -app.logger.info("Routes registered") +app.logger.info('Routes registered') diff --git a/packet/commands.py b/packet/commands.py index f1402c68..942bb9c8 100644 --- a/packet/commands.py +++ b/packet/commands.py @@ -16,7 +16,7 @@ ldap_is_on_coop -@app.cli.command("create-secret") +@app.cli.command('create-secret') def create_secret(): """ Generates a securely random token. Useful for creating a value for use in the "SECRET_KEY" config setting. @@ -33,37 +33,37 @@ class CSVFreshman: def __init__(self, row): self.name = row[0] self.rit_username = row[3] - self.onfloor = row[1] == "TRUE" + self.onfloor = row[1] == 'TRUE' def parse_csv(freshmen_csv): - print("Parsing file...") + print('Parsing file...') try: with open(freshmen_csv, newline='') as freshmen_csv_file: return {freshman.rit_username: freshman for freshman in map(CSVFreshman, csv.reader(freshmen_csv_file))} except Exception as e: - print("Failure while parsing CSV") + print('Failure while parsing CSV') raise e def input_date(prompt): while True: try: - date_str = input(prompt + " (format: MM/DD/YYYY): ") - return datetime.strptime(date_str, "%m/%d/%Y").date() + date_str = input(prompt + ' (format: MM/DD/YYYY): ') + return datetime.strptime(date_str, '%m/%d/%Y').date() except ValueError: pass -@app.cli.command("sync-freshmen") -@click.argument("freshmen_csv") +@app.cli.command('sync-freshmen') +@click.argument('freshmen_csv') def sync_freshmen(freshmen_csv): """ Updates the freshmen entries in the DB to match the given CSV. """ freshmen_in_csv = parse_csv(freshmen_csv) - print("Syncing contents with the DB...") + print('Syncing contents with the DB...') freshmen_in_db = {freshman.rit_username: freshman for freshman in Freshman.query.all()} for csv_freshman in freshmen_in_csv.values(): @@ -98,25 +98,25 @@ def sync_freshmen(freshmen_csv): db.session.add(FreshSignature(packet=packet, freshman=freshmen_in_db[csv_freshman.rit_username])) db.session.commit() - print("Done!") + print('Done!') -@app.cli.command("create-packets") -@click.argument("freshmen_csv") +@app.cli.command('create-packets') +@click.argument('freshmen_csv') def create_packets(freshmen_csv): """ Creates a new packet season for each of the freshmen in the given CSV. """ print("WARNING: The 'sync-freshmen' command must be run first to ensure that the state of floor is up to date.") - if input("Continue? (y/N): ").lower() != "y": + if input('Continue? (y/N): ').lower() != 'y': return # Collect the necessary data - base_date = input_date("Input the first day of packet season") + base_date = input_date('Input the first day of packet season') start = datetime.combine(base_date, packet_start_time) end = datetime.combine(base_date, packet_end_time) + timedelta(days=14) - print("Fetching data from LDAP...") + print('Fetching data from LDAP...') all_upper = list(filter( lambda member: not ldap_is_intromember(member) and not ldap_is_on_coop(member), ldap_get_active_members())) @@ -131,7 +131,7 @@ def create_packets(freshmen_csv): # Create the new packets and the signatures for each freshman in the given CSV freshmen_in_csv = parse_csv(freshmen_csv) - print("Creating DB entries and sending emails...") + print('Creating DB entries and sending emails...') for freshman in Freshman.query.filter(Freshman.rit_username.in_(freshmen_in_csv)).all(): packet = Packet(freshman=freshman, start=start, end=end) db.session.add(packet) @@ -153,15 +153,15 @@ def create_packets(freshmen_csv): db.session.add(FreshSignature(packet=packet, freshman=onfloor_freshman)) db.session.commit() - print("Done!") + print('Done!') -@app.cli.command("ldap-sync") +@app.cli.command('ldap-sync') def ldap_sync(): """ Updates the upper and misc sigs in the DB to match ldap. """ - print("Fetching data from LDAP...") + print('Fetching data from LDAP...') 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())} @@ -171,7 +171,7 @@ def ldap_sync(): c_m = ldap_get_constitutional_maintainers() drink = ldap_get_drink_admins() - print("Applying updates to the DB...") + print('Applying updates to the DB...') for packet in Packet.query.filter(Packet.end > datetime.now()).all(): # Update the role state of all UpperSignatures for sig in filter(lambda sig: sig.member in all_upper, packet.upper_signatures): @@ -215,39 +215,39 @@ def ldap_sync(): db.session.add(sig) db.session.commit() - print("Done!") + print('Done!') -@app.cli.command("fetch-results") +@app.cli.command('fetch-results') def fetch_results(): """ Fetches and prints the results from a given packet season. """ end_date = datetime.combine(input_date("Enter the last day of the packet season you'd like to retrieve results " - "from"), packet_end_time) + 'from'), packet_end_time) for packet in Packet.query.filter_by(end=end_date).all(): print() - print("{} ({}):".format(packet.freshman.name, packet.freshman.rit_username)) + print('{} ({}):'.format(packet.freshman.name, packet.freshman.rit_username)) received = packet.signatures_received() required = packet.signatures_required() - print("\tUpperclassmen score: {:0.2f}%".format(received.member_total / required.member_total * 100)) - print("\tTotal score: {:0.2f}%".format(received.total / required.total * 100)) + print('\tUpperclassmen score: {:0.2f}%'.format(received.member_total / required.member_total * 100)) + print('\tTotal score: {:0.2f}%'.format(received.total / required.total * 100)) print() - print("\tUpperclassmen: {}/{}".format(received.upper, required.upper)) - print("\tFreshmen: {}/{}".format(received.fresh, required.fresh)) - print("\tMiscellaneous: {}/{}".format(received.misc, required.misc)) + print('\tUpperclassmen: {}/{}'.format(received.upper, required.upper)) + print('\tFreshmen: {}/{}'.format(received.fresh, required.fresh)) + print('\tMiscellaneous: {}/{}'.format(received.misc, required.misc)) print() - print("\tTotal missed:", required.total - received.total) + print('\tTotal missed:', required.total - received.total) -@app.cli.command("extend-packet") -@click.argument("packet_id") +@app.cli.command('extend-packet') +@click.argument('packet_id') def extend_packet(packet_id): """ Extends the given packet by setting a new end date. @@ -255,49 +255,49 @@ def extend_packet(packet_id): packet = Packet.by_id(packet_id) if not packet.is_open(): - print("Packet is already closed so it cannot be extended") + print('Packet is already closed so it cannot be extended') return else: - print("Ready to extend packet #{} for {}".format(packet_id, packet.freshman_username)) + print('Ready to extend packet #{} for {}'.format(packet_id, packet.freshman_username)) - packet.end = datetime.combine(input_date("Enter the new end date for this packet"), packet_end_time) + packet.end = datetime.combine(input_date('Enter the new end date for this packet'), packet_end_time) db.session.commit() - print("Packet successfully extended") + print('Packet successfully extended') def remove_sig(packet_id, username, is_member): packet = Packet.by_id(packet_id) if not packet.is_open(): - print("Packet is already closed so its signatures cannot be modified") + print('Packet is already closed so its signatures cannot be modified') return elif is_member: sig = UpperSignature.query.filter_by(packet_id=packet_id, member=username).first() if sig is not None: sig.signed = False db.session.commit() - print("Successfully unsigned packet") + print('Successfully unsigned packet') else: result = MiscSignature.query.filter_by(packet_id=packet_id, member=username).delete() if result == 1: db.session.commit() - print("Successfully unsigned packet") + print('Successfully unsigned packet') else: - print("Failed to unsign packet; could not find signature") + print('Failed to unsign packet; could not find signature') else: sig = FreshSignature.query.filter_by(packet_id=packet_id, freshman_username=username).first() if sig is not None: sig.signed = False db.session.commit() - print("Successfully unsigned packet") + print('Successfully unsigned packet') else: - print("Failed to unsign packet; {} is not an onfloor".format(username)) + print('Failed to unsign packet; {} is not an onfloor'.format(username)) -@app.cli.command("remove-member-sig") -@click.argument("packet_id") -@click.argument("member") +@app.cli.command('remove-member-sig') +@click.argument('packet_id') +@click.argument('member') def remove_member_sig(packet_id, member): """ Removes the given member's signature from the given packet. @@ -306,9 +306,9 @@ def remove_member_sig(packet_id, member): remove_sig(packet_id, member, True) -@app.cli.command("remove-freshman-sig") -@click.argument("packet_id") -@click.argument("freshman") +@app.cli.command('remove-freshman-sig') +@click.argument('packet_id') +@click.argument('freshman') def remove_freshman_sig(packet_id, freshman): """ Removes the given freshman's signature from the given packet. diff --git a/packet/context_processors.py b/packet/context_processors.py index 8abe02df..604d931b 100644 --- a/packet/context_processors.py +++ b/packet/context_processors.py @@ -16,7 +16,7 @@ def get_csh_name(username): try: member = ldap_get_member(username) - return member.cn + " (" + member.uid + ")" + return member.cn + ' (' + member.uid + ')' except: return username @@ -28,17 +28,17 @@ def get_roles(sig): """ out = {} if sig.eboard: - out["eboard"] = sig.eboard + out['eboard'] = sig.eboard if sig.active_rtp: - out["rtp"] = "RTP" + out['rtp'] = 'RTP' if sig.three_da: - out["three_da"] = "3DA" + out['three_da'] = '3DA' if sig.webmaster: - out["webmaster"] = "Webmaster" + out['webmaster'] = 'Webmaster' if sig.c_m: - out["cm"] = "Constitutional Maintainer" + out['cm'] = 'Constitutional Maintainer' if sig.drink_admin: - out["drink"] = "Drink Admin" + out['drink'] = 'Drink Admin' return out @@ -47,7 +47,7 @@ def get_roles(sig): def get_rit_name(username): try: freshman = Freshman.query.filter_by(rit_username=username).first() - return freshman.name + " (" + username + ")" + return freshman.name + ' (' + username + ')' except: return username @@ -56,16 +56,16 @@ def get_rit_name(username): @lru_cache(maxsize=128) def get_rit_image(username): if username: - addresses = [username + "@rit.edu", username + "@g.rit.edu"] + 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" + url = 'https://gravatar.com/avatar/' + hashlib.md5(addr.encode('utf8')).hexdigest() + '.jpg?d=404&s=250' try: gravatar = urllib.request.urlopen(url) if gravatar.getcode() == 200: return url except: continue - return "https://www.gravatar.com/avatar/freshmen?d=mp&f=y" + return 'https://www.gravatar.com/avatar/freshmen?d=mp&f=y' def log_time(label): diff --git a/packet/ldap.py b/packet/ldap.py index 4068ecd7..30b2f285 100644 --- a/packet/ldap.py +++ b/packet/ldap.py @@ -19,8 +19,8 @@ def _ldap_is_member_of_group(member, group): """ :param member: A CSHMember instance """ - for group_dn in member.get("memberOf"): - if group == group_dn.split(",")[0][3:]: + for group_dn in member.get('memberOf'): + if group == group_dn.split(',')[0][3:]: return True return False @@ -41,7 +41,7 @@ def ldap_get_active_members(): Gets all current, dues-paying members :return: A list of CSHMember instances """ - return _ldap_get_group_members("active") + return _ldap_get_group_members('active') def ldap_get_intro_members(): @@ -49,7 +49,7 @@ def ldap_get_intro_members(): Gets all freshmen members :return: A list of CSHMember instances """ - return _ldap_get_group_members("intromembers") + return _ldap_get_group_members('intromembers') def ldap_get_eboard(): @@ -57,10 +57,10 @@ def ldap_get_eboard(): Gets all voting members of eboard :return: A list of CSHMember instances """ - members = _ldap_get_group_members("eboard-chairman") + _ldap_get_group_members("eboard-evaluations" - ) + _ldap_get_group_members("eboard-financial") + _ldap_get_group_members("eboard-history" - ) + _ldap_get_group_members("eboard-imps") + _ldap_get_group_members("eboard-opcomm" - ) + _ldap_get_group_members("eboard-research") + _ldap_get_group_members("eboard-social" + members = _ldap_get_group_members('eboard-chairman') + _ldap_get_group_members('eboard-evaluations' + ) + _ldap_get_group_members('eboard-financial') + _ldap_get_group_members('eboard-history' + ) + _ldap_get_group_members('eboard-imps') + _ldap_get_group_members('eboard-opcomm' + ) + _ldap_get_group_members('eboard-research') + _ldap_get_group_members('eboard-social' ) return members @@ -72,7 +72,7 @@ def ldap_get_live_onfloor(): :return: A list of CSHMember instances """ members = [] - onfloor = _ldap_get_group_members("onfloor") + onfloor = _ldap_get_group_members('onfloor') for member in onfloor: if ldap_get_roomnumber(member) and not ldap_is_eboard(member): members.append(member) @@ -85,7 +85,7 @@ def ldap_get_active_rtps(): All active RTPs :return: A list of CSHMember instances """ - return [member.uid for member in _ldap_get_group_members("active_rtp")] + return [member.uid for member in _ldap_get_group_members('active_rtp')] def ldap_get_3das(): @@ -93,7 +93,7 @@ def ldap_get_3das(): All 3das :return: A list of CSHMember instances """ - return [member.uid for member in _ldap_get_group_members("3da")] + return [member.uid for member in _ldap_get_group_members('3da')] def ldap_get_webmasters(): @@ -101,7 +101,7 @@ def ldap_get_webmasters(): All webmasters :return: A list of CSHMember instances """ - return [member.uid for member in _ldap_get_group_members("webmaster")] + return [member.uid for member in _ldap_get_group_members('webmaster')] def ldap_get_constitutional_maintainers(): @@ -109,7 +109,7 @@ def ldap_get_constitutional_maintainers(): All constitutional maintainers :return: A list of CSHMember instances """ - return [member.uid for member in _ldap_get_group_members("constitutional_maintainers")] + return [member.uid for member in _ldap_get_group_members('constitutional_maintainers')] def ldap_get_drink_admins(): @@ -117,7 +117,7 @@ def ldap_get_drink_admins(): All drink admins :return: A list of CSHMember instances """ - return [member.uid for member in _ldap_get_group_members("drink")] + return [member.uid for member in _ldap_get_group_members('drink')] def ldap_get_eboard_role(member): @@ -128,24 +128,24 @@ def ldap_get_eboard_role(member): return_val = None - if _ldap_is_member_of_group(member, "eboard-chairman"): - return_val = "Chairman" - elif _ldap_is_member_of_group(member, "eboard-evaluations"): - return_val = "Evals" - elif _ldap_is_member_of_group(member, "eboard-financial"): - return_val = "Financial" - elif _ldap_is_member_of_group(member, "eboard-history"): - return_val = "History" - elif _ldap_is_member_of_group(member, "eboard-imps"): - return_val = "Imps" - elif _ldap_is_member_of_group(member, "eboard-opcomm"): - return_val = "OpComm" - elif _ldap_is_member_of_group(member, "eboard-research"): - return_val = "R&D" - elif _ldap_is_member_of_group(member, "eboard-social"): - return_val = "Social" - elif _ldap_is_member_of_group(member, "eboard-secretary"): - return_val = "Secretary" + if _ldap_is_member_of_group(member, 'eboard-chairman'): + return_val = 'Chairman' + elif _ldap_is_member_of_group(member, 'eboard-evaluations'): + return_val = 'Evals' + elif _ldap_is_member_of_group(member, 'eboard-financial'): + return_val = 'Financial' + elif _ldap_is_member_of_group(member, 'eboard-history'): + return_val = 'History' + elif _ldap_is_member_of_group(member, 'eboard-imps'): + return_val = 'Imps' + elif _ldap_is_member_of_group(member, 'eboard-opcomm'): + return_val = 'OpComm' + elif _ldap_is_member_of_group(member, 'eboard-research'): + return_val = 'R&D' + elif _ldap_is_member_of_group(member, 'eboard-social'): + return_val = 'Social' + elif _ldap_is_member_of_group(member, 'eboard-secretary'): + return_val = 'Secretary' return return_val @@ -155,14 +155,14 @@ def ldap_is_eboard(member): """ :param member: A CSHMember instance """ - return _ldap_is_member_of_group(member, "eboard") + return _ldap_is_member_of_group(member, 'eboard') def ldap_is_intromember(member): """ :param member: A CSHMember instance """ - return _ldap_is_member_of_group(member, "intromembers") + return _ldap_is_member_of_group(member, 'intromembers') def ldap_is_on_coop(member): @@ -170,9 +170,9 @@ def ldap_is_on_coop(member): :param member: A CSHMember instance """ if date.today().month > 6: - return _ldap_is_member_of_group(member, "fall_coop") + return _ldap_is_member_of_group(member, 'fall_coop') else: - return _ldap_is_member_of_group(member, "spring_coop") + return _ldap_is_member_of_group(member, 'spring_coop') def ldap_get_roomnumber(member): diff --git a/packet/log_utils.py b/packet/log_utils.py index d9f81d0a..66c14531 100644 --- a/packet/log_utils.py +++ b/packet/log_utils.py @@ -22,7 +22,7 @@ def wrapped_function(*args, **kwargs): result = func(*args, **kwargs) seconds = (datetime.now() - start).total_seconds() - app.logger.info("{}.{}() returned after {} seconds".format(func.__module__, func.__name__, seconds)) + app.logger.info('{}.{}() returned after {} seconds'.format(func.__module__, func.__name__, seconds)) return result @@ -34,7 +34,7 @@ def _format_cache(func): :return: The output of func.cache_info() as a compactly formatted string """ info = func.cache_info() - return "{}[hits={}, misses={}, size={}/{}]".format(func.__name__, info.hits, info.misses, info.currsize, + return '{}[hits={}, misses={}, size={}/{}]'.format(func.__name__, info.hits, info.misses, info.currsize, info.maxsize) @@ -51,7 +51,7 @@ def log_cache(func): def wrapped_function(*args, **kwargs): result = func(*args, **kwargs) - app.logger.info("Cache stats: " + ", ".join(map(_format_cache, _caches))) + app.logger.info('Cache stats: ' + ', '.join(map(_format_cache, _caches))) return result diff --git a/packet/mail.py b/packet/mail.py index 5d53a212..b5a4f12a 100644 --- a/packet/mail.py +++ b/packet/mail.py @@ -7,31 +7,31 @@ def send_start_packet_mail(packet): - if app.config["MAIL_PROD"]: - recipients = ["<" + packet.freshman.rit_username + "@rit.edu>"] - msg = Message(subject="CSH Packet Starts " + packet.start.strftime("%A, %B %-d"), - sender=app.config.get("MAIL_USERNAME"), + if app.config['MAIL_PROD']: + recipients = ['<' + packet.freshman.rit_username + '@rit.edu>'] + msg = Message(subject='CSH Packet Starts ' + packet.start.strftime('%A, %B %-d'), + sender=app.config.get('MAIL_USERNAME'), recipients=recipients) - template = "mail/packet_start" - msg.body = render_template(template + ".txt", packet=packet) - msg.html = render_template(template + ".html", packet=packet) - app.logger.info("Sending mail to " + recipients[0]) + template = 'mail/packet_start' + msg.body = render_template(template + '.txt', packet=packet) + msg.html = render_template(template + '.html', packet=packet) + app.logger.info('Sending mail to ' + recipients[0]) mail.send(msg) def send_report_mail(form_results, reporter): - if app.config["MAIL_PROD"]: - recipients = [""] - msg = Message(subject="Packet Report", - sender=app.config.get("MAIL_USERNAME"), + if app.config['MAIL_PROD']: + recipients = [''] + msg = Message(subject='Packet Report', + sender=app.config.get('MAIL_USERNAME'), recipients=recipients) - person = form_results["person"] - report = form_results["report"] + person = form_results['person'] + report = form_results['report'] - template = "mail/report" - msg.body = render_template(template + ".txt", person=person, report=report, reporter=reporter) - msg.html = render_template(template + ".html", person=person, report=report, reporter=reporter) - app.logger.info("Sending mail to " + recipients[0]) + template = 'mail/report' + msg.body = render_template(template + '.txt', person=person, report=report, reporter=reporter) + msg.html = render_template(template + '.html', person=person, report=report, reporter=reporter) + app.logger.info('Sending mail to ' + recipients[0]) mail.send(msg) diff --git a/packet/models.py b/packet/models.py index dc60d570..6f8cbb6d 100644 --- a/packet/models.py +++ b/packet/models.py @@ -33,14 +33,14 @@ def __init__(self, upper, fresh, misc): class Freshman(db.Model): - __tablename__ = "freshman" + __tablename__ = 'freshman' rit_username = Column(String(10), primary_key=True) name = Column(String(64), nullable=False) onfloor = Column(Boolean, nullable=False) - fresh_signatures = relationship("FreshSignature") + fresh_signatures = relationship('FreshSignature') # One freshman can have multiple packets if they repeat the intro process - packets = relationship("Packet", order_by="desc(Packet.id)") + packets = relationship('Packet', order_by='desc(Packet.id)') @classmethod def by_username(cls, username: str): @@ -51,21 +51,21 @@ def by_username(cls, username: str): class Packet(db.Model): - __tablename__ = "packet" + __tablename__ = 'packet' id = Column(Integer, primary_key=True, autoincrement=True) - freshman_username = Column(ForeignKey("freshman.rit_username")) + freshman_username = Column(ForeignKey('freshman.rit_username')) start = Column(DateTime, nullable=False) end = Column(DateTime, nullable=False) - freshman = relationship("Freshman", back_populates="packets") + freshman = relationship('Freshman', back_populates='packets') - # The `lazy="subquery"` kwarg enables eager loading for signatures which makes signature calculations much faster + # The `lazy='subquery'` kwarg enables eager loading for signatures which makes signature calculations much faster # See the docs here for details: https://docs.sqlalchemy.org/en/latest/orm/loading_relationships.html - upper_signatures = relationship("UpperSignature", lazy="subquery", - order_by="UpperSignature.signed.desc(), UpperSignature.updated") - fresh_signatures = relationship("FreshSignature", lazy="subquery", - order_by="FreshSignature.signed.desc(), FreshSignature.updated") - misc_signatures = relationship("MiscSignature", lazy="subquery", order_by="MiscSignature.updated") + upper_signatures = relationship('UpperSignature', lazy='subquery', + order_by='UpperSignature.signed.desc(), UpperSignature.updated') + fresh_signatures = relationship('FreshSignature', lazy='subquery', + order_by='FreshSignature.signed.desc(), FreshSignature.updated') + misc_signatures = relationship('MiscSignature', lazy='subquery', order_by='MiscSignature.updated') def is_open(self): return self.start < datetime.now() < self.end @@ -128,8 +128,8 @@ def by_id(cls, packet_id): return cls.query.filter_by(id=packet_id).first() class UpperSignature(db.Model): - __tablename__ = "signature_upper" - packet_id = Column(Integer, ForeignKey("packet.id"), primary_key=True) + __tablename__ = 'signature_upper' + packet_id = Column(Integer, ForeignKey('packet.id'), primary_key=True) member = Column(String(36), primary_key=True) signed = Column(Boolean, default=False, nullable=False) eboard = Column(String(12), nullable=True) @@ -140,31 +140,31 @@ class UpperSignature(db.Model): drink_admin = Column(Boolean, default=False, nullable=False) updated = Column(DateTime, default=datetime.now, onupdate=datetime.now, nullable=False) - packet = relationship("Packet", back_populates="upper_signatures") + packet = relationship('Packet', back_populates='upper_signatures') class FreshSignature(db.Model): - __tablename__ = "signature_fresh" - packet_id = Column(Integer, ForeignKey("packet.id"), primary_key=True) - freshman_username = Column(ForeignKey("freshman.rit_username"), primary_key=True) + __tablename__ = 'signature_fresh' + packet_id = Column(Integer, ForeignKey('packet.id'), primary_key=True) + freshman_username = Column(ForeignKey('freshman.rit_username'), primary_key=True) signed = Column(Boolean, default=False, nullable=False) updated = Column(DateTime, default=datetime.now, onupdate=datetime.now, nullable=False) - packet = relationship("Packet", back_populates="fresh_signatures") - freshman = relationship("Freshman", back_populates="fresh_signatures") + packet = relationship('Packet', back_populates='fresh_signatures') + freshman = relationship('Freshman', back_populates='fresh_signatures') class MiscSignature(db.Model): - __tablename__ = "signature_misc" - packet_id = Column(Integer, ForeignKey("packet.id"), primary_key=True) + __tablename__ = 'signature_misc' + packet_id = Column(Integer, ForeignKey('packet.id'), primary_key=True) member = Column(String(36), primary_key=True) updated = Column(DateTime, default=datetime.now, onupdate=datetime.now, nullable=False) - packet = relationship("Packet", back_populates="misc_signatures") + packet = relationship('Packet', back_populates='misc_signatures') class NotificationSubscription(db.Model): - __tablename__ = "notification_subscriptions" + __tablename__ = 'notification_subscriptions' member = Column(String(36), nullable=True) - freshman_username = Column(ForeignKey("freshman.rit_username"), nullable=True) + freshman_username = Column(ForeignKey('freshman.rit_username'), nullable=True) token = Column(String(256), primary_key=True, nullable=False) diff --git a/packet/notifications.py b/packet/notifications.py index ace98c48..a3a93f2c 100644 --- a/packet/notifications.py +++ b/packet/notifications.py @@ -4,11 +4,11 @@ from packet.models import NotificationSubscription post_body = { - "contents": {"en": "Default message"}, - "headings": {"en": "Default Title"}, - "chrome_web_icon": app.config["PROTOCOL"] + app.config["SERVER_NAME"] + "/static/android-chrome-512x512.png", - "chrome_web_badge": app.config["PROTOCOL"] + app.config["SERVER_NAME"] + "/static/android-chrome-512x512.png", - "url": app.config["PROTOCOL"] + app.config["SERVER_NAME"] + 'contents': {'en': 'Default message'}, + 'headings': {'en': 'Default Title'}, + 'chrome_web_icon': app.config['PROTOCOL'] + app.config['SERVER_NAME'] + '/static/android-chrome-512x512.png', + 'chrome_web_badge': app.config['PROTOCOL'] + app.config['SERVER_NAME'] + '/static/android-chrome-512x512.png', + 'url': app.config['PROTOCOL'] + app.config['SERVER_NAME'] } @@ -16,22 +16,22 @@ def send_notification(notification_body, subscriptions, client): tokens = list(map(lambda subscription: subscription.token, subscriptions)) if tokens: notification = onesignal.Notification(post_body=notification_body) - notification.post_body["include_player_ids"] = tokens + notification.post_body['include_player_ids'] = tokens onesignal_response = client.send_notification(notification) if onesignal_response.status_code == 200: - app.logger.info("The notification ({}) sent out successfully".format(notification.post_body)) + app.logger.info('The notification ({}) sent out successfully'.format(notification.post_body)) else: - app.logger.warn("The notification ({}) was unsuccessful".format(notification.post_body)) + app.logger.warn('The notification ({}) was unsuccessful'.format(notification.post_body)) def packet_signed_notification(packet, signer): subscriptions = NotificationSubscription.query.filter_by(freshman_username=packet.freshman_username) if subscriptions: notification_body = post_body - notification_body["contents"]["en"] = signer + " signed your packet! Congrats or I'm Sorry" - notification_body["headings"]["en"] = "New Packet Signature!" - notification_body["chrome_web_icon"] = "https://profiles.csh.rit.edu/image/" + signer - notification_body["url"] = app.config["PROTOCOL"] + app.config["PACKET_INTRO"] + notification_body['contents']['en'] = signer + " signed your packet! Congrats or I'm Sorry" + notification_body['headings']['en'] = 'New Packet Signature!' + notification_body['chrome_web_icon'] = 'https://profiles.csh.rit.edu/image/' + signer + notification_body['url'] = app.config['PROTOCOL'] + app.config['PACKET_INTRO'] send_notification(notification_body, subscriptions, intro_onesignal_client) @@ -41,10 +41,10 @@ def packet_100_percent_notification(packet): intro_subscriptions = NotificationSubscription.query.filter(NotificationSubscription.freshman_username.isnot(None)) if member_subscriptions or intro_subscriptions: notification_body = post_body - notification_body["contents"]["en"] = packet.freshman.name + " got 💯 on packet!" - notification_body["headings"]["en"] = "New 100% on Packet!" + notification_body['contents']['en'] = packet.freshman.name + ' got 💯 on packet!' + notification_body['headings']['en'] = 'New 100% on Packet!' # TODO: Issue #156 - notification_body["chrome_web_icon"] = "https://profiles.csh.rit.edu/image/" + packet.freshman_username + notification_body['chrome_web_icon'] = 'https://profiles.csh.rit.edu/image/' + packet.freshman_username send_notification(notification_body, member_subscriptions, csh_onesignal_client) send_notification(notification_body, intro_subscriptions, intro_onesignal_client) @@ -54,10 +54,10 @@ def packet_starting_notification(packet): subscriptions = NotificationSubscription.query.filter_by(freshman_username=packet.freshman_username) if subscriptions: notification_body = post_body - notification_body["contents"]["en"] = "Log into your packet, and get started meeting people!" - notification_body["headings"]["en"] = "Your packet has begun!" - notification_body["url"] = app.config["PROTOCOL"] + app.config["PACKET_INTRO"] - notification_body["send_after"] = packet.start.strftime("%Y-%m-%d %H:%M:%S") + notification_body['contents']['en'] = 'Log into your packet, and get started meeting people!' + notification_body['headings']['en'] = 'Your packet has begun!' + notification_body['url'] = app.config['PROTOCOL'] + app.config['PACKET_INTRO'] + notification_body['send_after'] = packet.start.strftime('%Y-%m-%d %H:%M:%S') send_notification(notification_body, subscriptions, intro_onesignal_client) @@ -66,8 +66,8 @@ def packets_starting_notification(start_date): member_subscriptions = NotificationSubscription.query.filter(NotificationSubscription.member.isnot(None)) if member_subscriptions: notification_body = post_body - notification_body["contents"]["en"] = "New packets have started, visit packet to see them!" - notification_body["headings"]["en"] = "Packets Start Today!" - notification_body["send_after"] = start_date.strftime("%Y-%m-%d %H:%M:%S") + notification_body['contents']['en'] = 'New packets have started, visit packet to see them!' + notification_body['headings']['en'] = 'Packets Start Today!' + notification_body['send_after'] = start_date.strftime('%Y-%m-%d %H:%M:%S') send_notification(notification_body, member_subscriptions, csh_onesignal_client) diff --git a/packet/routes/api.py b/packet/routes/api.py index 1b48c99f..0169337f 100644 --- a/packet/routes/api.py +++ b/packet/routes/api.py @@ -11,7 +11,7 @@ from packet.notifications import packet_signed_notification, packet_100_percent_notification -@app.route("/api/v1/packets/", methods=["GET"]) +@app.route('/api/v1/packets/', methods=['GET']) @packet_auth def get_packets_by_user(username: str) -> dict: """ @@ -25,7 +25,7 @@ def get_packets_by_user(username: str) -> dict: } for packet in frosh.packets} -@app.route("/api/v1/packets//newest", methods=["GET"]) +@app.route('/api/v1/packets//newest', methods=['GET']) @packet_auth def get_newest_packet_by_user(username: str) -> dict: """ @@ -45,7 +45,7 @@ def get_newest_packet_by_user(username: str) -> dict: } -@app.route("/api/v1/packet/", methods=["GET"]) +@app.route('/api/v1/packet/', methods=['GET']) @packet_auth def get_packet_by_id(packet_id: int) -> dict: """ @@ -59,7 +59,7 @@ def get_packet_by_id(packet_id: int) -> dict: 'received': vars(packet.signatures_received()), } -@app.route("/api/v1/sign//", methods=["POST"]) +@app.route('/api/v1/sign//', methods=['POST']) @packet_auth @before_request def sign(packet_id, info): @@ -67,49 +67,49 @@ def sign(packet_id, info): if packet is not None and packet.is_open(): was_100 = packet.is_100() - if app.config["REALM"] == "csh": + if app.config['REALM'] == 'csh': # Check if the CSHer is an upperclassman and if so, sign that row - for sig in filter(lambda sig: sig.member == info["uid"], packet.upper_signatures): + for sig in filter(lambda sig: sig.member == info['uid'], packet.upper_signatures): sig.signed = True - app.logger.info("Member {} signed packet {} as an upperclassman".format(info["uid"], packet_id)) - return commit_sig(packet, was_100, info["uid"]) + app.logger.info('Member {} signed packet {} as an upperclassman'.format(info['uid'], packet_id)) + return commit_sig(packet, was_100, info['uid']) # The CSHer is a misc so add a new row - db.session.add(MiscSignature(packet=packet, member=info["uid"])) - app.logger.info("Member {} signed packet {} as a misc".format(info["uid"], packet_id)) - return commit_sig(packet, was_100, info["uid"]) + db.session.add(MiscSignature(packet=packet, member=info['uid'])) + app.logger.info('Member {} signed packet {} as a misc'.format(info['uid'], packet_id)) + return commit_sig(packet, was_100, info['uid']) else: # Check if the freshman is onfloor and if so, sign that row - for sig in filter(lambda sig: sig.freshman_username == info["uid"], packet.fresh_signatures): + for sig in filter(lambda sig: sig.freshman_username == info['uid'], packet.fresh_signatures): sig.signed = True - app.logger.info("Freshman {} signed packet {}".format(info["uid"], packet_id)) - return commit_sig(packet, was_100, info["uid"]) + app.logger.info('Freshman {} signed packet {}'.format(info['uid'], packet_id)) + return commit_sig(packet, was_100, info['uid']) - app.logger.warn("Failed to add {}'s signature to packet {}".format(info["uid"], packet_id)) - return "Error: Signature not valid. Reason: Unknown" + app.logger.warn("Failed to add {}'s signature to packet {}".format(info['uid'], packet_id)) + return 'Error: Signature not valid. Reason: Unknown' -@app.route("/api/v1/subscribe/", methods=["POST"]) +@app.route('/api/v1/subscribe/', methods=['POST']) @packet_auth @before_request def subscribe(info): data = request.form - if app.config["REALM"] == "csh": - subscription = NotificationSubscription(token=data["token"], member=info["uid"]) + if app.config['REALM'] == 'csh': + subscription = NotificationSubscription(token=data['token'], member=info['uid']) else: - subscription = NotificationSubscription(token=data["token"], freshman_username=info["uid"]) + subscription = NotificationSubscription(token=data['token'], freshman_username=info['uid']) db.session.add(subscription) db.session.commit() - return "Token subscribed for " + info["uid"] + return 'Token subscribed for ' + info['uid'] -@app.route("/api/v1/report/", methods=["POST"]) +@app.route('/api/v1/report/', methods=['POST']) @packet_auth @before_request def report(info): form_results = request.form - send_report_mail(form_results, get_rit_name(info["uid"])) - return "Success: " + get_rit_name(info["uid"]) + " sent a report" + send_report_mail(form_results, get_rit_name(info['uid'])) + return 'Success: ' + get_rit_name(info['uid']) + ' sent a report' def commit_sig(packet, was_100, uid): @@ -119,4 +119,4 @@ def commit_sig(packet, was_100, uid): packet_100_percent_notification(packet) notify_slack(packet.freshman.name) - return "Success: Signed Packet: " + packet.freshman_username + return 'Success: Signed Packet: ' + packet.freshman_username diff --git a/packet/routes/freshmen.py b/packet/routes/freshmen.py index 7414c16d..85d3a28c 100644 --- a/packet/routes/freshmen.py +++ b/packet/routes/freshmen.py @@ -9,13 +9,13 @@ from packet.utils import before_request, packet_auth -@app.route("/") +@app.route('/') @packet_auth @before_request def index(info=None): most_recent_packet = Packet.query.filter_by(freshman_username=info['uid']).order_by(Packet.id.desc()).first() if most_recent_packet is not None: - return redirect(url_for("freshman_packet", packet_id=most_recent_packet.id), 302) + return redirect(url_for('freshman_packet', packet_id=most_recent_packet.id), 302) else: - return redirect(url_for("packets"), 302) + return redirect(url_for('packets'), 302) diff --git a/packet/routes/shared.py b/packet/routes/shared.py index 8f4422ca..bebb4cae 100644 --- a/packet/routes/shared.py +++ b/packet/routes/shared.py @@ -10,13 +10,13 @@ from packet.log_utils import log_cache, log_time -@app.route("/logout/") +@app.route('/logout/') @auth.oidc_logout def logout(): - return redirect("http://csh.rit.edu") + return redirect('http://csh.rit.edu') -@app.route("/packet//") +@app.route('/packet//') @log_cache @packet_auth @before_request @@ -25,20 +25,20 @@ def freshman_packet(packet_id, info=None): packet = Packet.by_id(packet_id) if packet is None: - return "Invalid packet or freshman", 404 + return 'Invalid packet or freshman', 404 else: can_sign = packet.is_open() # If the packet is open and the user is an off-floor freshman set can_sign to False - if packet.is_open() and app.config["REALM"] != "csh": - if info["uid"] not in map(lambda sig: sig.freshman_username, packet.fresh_signatures): + if packet.is_open() and app.config['REALM'] != 'csh': + if info['uid'] not in map(lambda sig: sig.freshman_username, packet.fresh_signatures): can_sign = False - return render_template("packet.html", + return render_template('packet.html', info=info, packet=packet, can_sign=can_sign, - did_sign=packet.did_sign(info["uid"], app.config["REALM"] == "csh"), + did_sign=packet.did_sign(info['uid'], app.config['REALM'] == 'csh'), required=packet.signatures_required(), received=packet.signatures_received(), upper=packet.upper_signatures) @@ -51,7 +51,7 @@ def packet_sort_key(packet): return packet.signatures_received_result.total, packet.did_sign_result -@app.route("/packets/") +@app.route('/packets/') @log_cache @packet_auth @before_request @@ -61,13 +61,13 @@ def packets(info=None): # Pre-calculate and store the return values of did_sign(), signatures_received(), and signatures_required() for packet in open_packets: - packet.did_sign_result = packet.did_sign(info["uid"], app.config["REALM"] == "csh") + packet.did_sign_result = packet.did_sign(info['uid'], app.config['REALM'] == 'csh') packet.signatures_received_result = packet.signatures_received() packet.signatures_required_result = packet.signatures_required() open_packets.sort(key=packet_sort_key, reverse=True) - return render_template("active_packets.html", info=info, packets=open_packets) + return render_template('active_packets.html', info=info, packets=open_packets) @app.route('/sw.js', methods=['GET']) diff --git a/packet/routes/upperclassmen.py b/packet/routes/upperclassmen.py index 9b7dc807..c8cdd7c1 100644 --- a/packet/routes/upperclassmen.py +++ b/packet/routes/upperclassmen.py @@ -12,13 +12,13 @@ from packet.log_utils import log_cache, log_time -@app.route("/") +@app.route('/') @packet_auth def index(): - return redirect(url_for("packets"), 302) + return redirect(url_for('packets'), 302) -@app.route("/member//") +@app.route('/member//') @log_cache @packet_auth @before_request @@ -35,11 +35,11 @@ def upperclassman(uid, info=None): open_packets.sort(key=lambda packet: packet.freshman_username) open_packets.sort(key=lambda packet: packet.did_sign_result, reverse=True) - return render_template("upperclassman.html", info=info, open_packets=open_packets, member=uid, + return render_template('upperclassman.html', info=info, open_packets=open_packets, member=uid, signatures=signatures) -@app.route("/upperclassmen/") +@app.route('/upperclassmen/') @log_cache @packet_auth @before_request @@ -59,5 +59,5 @@ def upperclassmen_total(info=None): elif sig.signed: upperclassmen[sig.member] += 1 - return render_template("upperclassmen_totals.html", info=info, num_open_packets=len(open_packets), + return render_template('upperclassmen_totals.html', info=info, num_open_packets=len(open_packets), upperclassmen=sorted(upperclassmen.items(), key=itemgetter(1), reverse=True)) diff --git a/packet/utils.py b/packet/utils.py index cc412066..317ef369 100644 --- a/packet/utils.py +++ b/packet/utils.py @@ -11,7 +11,7 @@ from packet.models import Freshman from packet.ldap import ldap_get_member, ldap_is_intromember -INTRO_REALM = "https://sso.csh.rit.edu/auth/realms/intro" +INTRO_REALM = 'https://sso.csh.rit.edu/auth/realms/intro' def before_request(func): """ @@ -20,21 +20,21 @@ def before_request(func): """ @wraps(func) def wrapped_function(*args, **kwargs): - uid = str(session["userinfo"].get("preferred_username", "")) + uid = str(session['userinfo'].get('preferred_username', '')) - if session["id_token"]["iss"] == INTRO_REALM: + if session['id_token']['iss'] == INTRO_REALM: info = { - "realm": "intro", - "uid": uid, - "onfloor": is_freshman_on_floor(uid) + 'realm': 'intro', + 'uid': uid, + 'onfloor': is_freshman_on_floor(uid) } else: info = { - "realm": "csh", - "uid": uid + 'realm': 'csh', + 'uid': uid } - kwargs["info"] = info + kwargs['info'] = info return func(*args, **kwargs) return wrapped_function @@ -59,11 +59,11 @@ def packet_auth(func): @auth.oidc_auth('app') @wraps(func) def wrapped_function(*args, **kwargs): - if app.config["REALM"] == "csh": - username = str(session["userinfo"].get("preferred_username", "")) + if app.config['REALM'] == 'csh': + username = str(session['userinfo'].get('preferred_username', '')) if ldap_is_intromember(ldap_get_member(username)): - app.logger.warn("Stopped intro member {} from accessing upperclassmen packet".format(username)) - return redirect(app.config["PROTOCOL"] + app.config["PACKET_INTRO"], code=301) + app.logger.warn('Stopped intro member {} from accessing upperclassmen packet'.format(username)) + return redirect(app.config['PROTOCOL'] + app.config['PACKET_INTRO'], code=301) return func(*args, **kwargs) @@ -74,10 +74,10 @@ def notify_slack(name: str): """ Sends a congratulate on sight decree to Slack """ - if app.config["SLACK_WEBHOOK_URL"] is None: - app.logger.warn("SLACK_WEBHOOK_URL not configured, not sending message to slack.") + if app.config['SLACK_WEBHOOK_URL'] is None: + app.logger.warn('SLACK_WEBHOOK_URL not configured, not sending message to slack.') return msg = f':pizza-party: {name} got :100: on packet! :pizza-party:' - requests.put(app.config["SLACK_WEBHOOK_URL"], json={'text':msg}) - app.logger.info("Posted 100% notification to slack for " + name) + requests.put(app.config['SLACK_WEBHOOK_URL'], json={'text':msg}) + app.logger.info('Posted 100% notification to slack for ' + name) From eb456dae790d8abceba07278140c8abd853a40ac Mon Sep 17 00:00:00 2001 From: Joel Eager Date: Wed, 23 Oct 2019 22:25:19 -0400 Subject: [PATCH 5/5] Version bump to 3^3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8e362207..6efcb9a2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "title": "CSH Packet", "name": "csh-packet", - "version": "3.3.2", + "version": "3.3.3", "description": "A web app implementation of the CSH introductory packet.", "bugs": { "url": "https://github.com/ComputerScienceHouse/packet/issues",