From ccb4bbe31d1be779a5ad2837c4e1710999e7d033 Mon Sep 17 00:00:00 2001 From: Marc Billow Date: Mon, 19 Jun 2017 03:05:12 -0400 Subject: [PATCH 1/2] Add Log Table --- migrations/versions/117567def844_.py | 36 ++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 migrations/versions/117567def844_.py diff --git a/migrations/versions/117567def844_.py b/migrations/versions/117567def844_.py new file mode 100644 index 00000000..58f8361c --- /dev/null +++ b/migrations/versions/117567def844_.py @@ -0,0 +1,36 @@ +"""Add Log Table for User Actions + +Revision ID: 117567def844 +Revises: 2c3193839c9d +Create Date: 2017-06-19 00:39:17.408944 + +""" + +# revision identifiers, used by Alembic. +revision = '117567def844' +down_revision = '2c3193839c9d' + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +def upgrade(): + ### commands auto generated by Alembic - please adjust! ### + op.create_table('user_log', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('ipaddr', postgresql.INET(), nullable=False), + sa.Column('timestamp', sa.DateTime(), nullable=False), + sa.Column('uid', sa.String(length=32), nullable=False), + sa.Column('method', sa.Enum('GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'CONNECT', 'OPTIONS', 'TRACE', 'PATCH', name='http_enum'), nullable=True), + sa.Column('blueprint', sa.String(length=32), nullable=False), + sa.Column('path', sa.String(length=128), nullable=False), + sa.Column('description', sa.String(length=128), nullable=False), + sa.PrimaryKeyConstraint('id') + ) + ### end Alembic commands ### + + +def downgrade(): + ### commands auto generated by Alembic - please adjust! ### + op.drop_table('user_log') + ### end Alembic commands ### From 280eb5bee7ca84da80d1cddc12cb4f7ec16055df Mon Sep 17 00:00:00 2001 From: Marc Billow Date: Mon, 19 Jun 2017 03:05:27 -0400 Subject: [PATCH 2/2] Change logging for all blueprints --- conditional/__init__.py | 43 +++- conditional/blueprints/attendance.py | 231 ++++++++---------- conditional/blueprints/cache_management.py | 6 +- conditional/blueprints/co_op.py | 16 +- conditional/blueprints/conditional.py | 23 +- conditional/blueprints/dashboard.py | 6 +- conditional/blueprints/housing.py | 29 +-- conditional/blueprints/intro_evals.py | 7 +- conditional/blueprints/intro_evals_form.py | 11 +- .../blueprints/major_project_submission.py | 22 +- conditional/blueprints/member_management.py | 158 ++++++------ conditional/blueprints/slideshow.py | 33 +-- conditional/blueprints/spring_evals.py | 6 +- conditional/models/models.py | 23 ++ 14 files changed, 303 insertions(+), 311 deletions(-) diff --git a/conditional/__init__.py b/conditional/__init__.py index 5ebb7ea9..5157e928 100644 --- a/conditional/__init__.py +++ b/conditional/__init__.py @@ -22,9 +22,9 @@ except (InvalidGitRepository, KeyError): app.config["GIT_REVISION"] = "unknown" + db = SQLAlchemy(app) migrate = Migrate(app, db) -logger = structlog.get_logger() sentry = Sentry(app) ldap = CSHLDAP(app.config['LDAP_BIND_DN'], @@ -38,8 +38,47 @@ def start_of_year(): return start # pylint: disable=C0413 +from conditional.models.models import UserLog + +# Configure Logging +def request_processor(logger, log_method, event_dict): # pylint: disable=unused-argument, redefined-outer-name + if 'request' in event_dict: + flask_request = event_dict['request'] + event_dict['user'] = flask_request.headers.get("x-webauth-user") + event_dict['ip'] = flask_request.remote_addr + event_dict['method'] = flask_request.method + event_dict['blueprint'] = flask_request.blueprint + event_dict['path'] = flask_request.full_path + return event_dict + + +def database_processor(logger, log_method, event_dict): # pylint: disable=unused-argument, redefined-outer-name + if 'request' in event_dict: + if event_dict['method'] != 'GET': + log = UserLog( + ipaddr=event_dict['ip'], + user=event_dict['user'], + method=event_dict['method'], + blueprint=event_dict['blueprint'], + path=event_dict['path'], + description=event_dict['event'] + ) + db.session.add(log) + db.session.flush() + db.session.commit() + del event_dict['request'] + return event_dict + +structlog.configure(processors=[ + request_processor, + database_processor, + structlog.processors.KeyValueRenderer() + ]) + +logger = structlog.get_logger() + -from conditional.blueprints.dashboard import dashboard_bp +from conditional.blueprints.dashboard import dashboard_bp # pylint: disable=ungrouped-imports from conditional.blueprints.attendance import attendance_bp from conditional.blueprints.major_project_submission import major_project_bp from conditional.blueprints.intro_evals import intro_evals_bp diff --git a/conditional/blueprints/attendance.py b/conditional/blueprints/attendance.py index 830d17f4..78a20e62 100644 --- a/conditional/blueprints/attendance.py +++ b/conditional/blueprints/attendance.py @@ -1,6 +1,5 @@ from datetime import datetime -import uuid import structlog from flask import Blueprint, jsonify, redirect, request @@ -34,9 +33,8 @@ @attendance_bp.route('/attendance/ts_members') def get_all_members(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='retrieve technical seminar attendance list') + log = logger.new(request=request) + log.info('Retrieve Technical Seminar Attendance List') members = ldap_get_current_students() @@ -61,9 +59,8 @@ def get_all_members(): @attendance_bp.route('/attendance/hm_members') def get_non_alumni_non_coop(internal=False): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='retrieve house meeting attendance list') + log = logger.new(request=request) + log.info('Retrieve House Meeting Attendance List') # Get all active members as a base house meeting attendance. active_members = ldap_get_active_members() @@ -105,9 +102,8 @@ def get_non_alumni_non_coop(internal=False): @attendance_bp.route('/attendance/cm_members') def get_non_alumni(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='retrieve committee meeting attendance list') + log = logger.new(request=request) + log.info('Retrieve Committee Meeting Attendance List') current_students = ldap_get_current_students() @@ -132,9 +128,8 @@ def get_non_alumni(): @attendance_bp.route('/attendance_cm') def display_attendance_cm(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('frontend', action='display committee meeting attendance page') + log = logger.new(request=request) + log.info('Display Committee Meeting Attendance Page') return render_template(request, 'attendance_cm.html', @@ -144,9 +139,8 @@ def display_attendance_cm(): @attendance_bp.route('/attendance_ts') def display_attendance_ts(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('frontend', action='display technical seminar attendance page') + log = logger.new(request=request) + log.info('Display Technical Seminar Attendance Page') return render_template(request, 'attendance_ts.html', @@ -156,9 +150,8 @@ def display_attendance_ts(): @attendance_bp.route('/attendance_hm') def display_attendance_hm(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('frontend', action='display house meeting attendance page') + log = logger.new(request=request) + log.info('Display House Meeting Attendance Page') user_name = request.headers.get('x-webauth-user') account = ldap_get_member(user_name) @@ -174,9 +167,8 @@ def display_attendance_hm(): @attendance_bp.route('/attendance/submit/cm', methods=['POST']) def submit_committee_attendance(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='submit committee meeting attendance') + log = logger.new(request=request) + user_name = request.headers.get('x-webauth-user') account = ldap_get_member(user_name) @@ -188,6 +180,8 @@ def submit_committee_attendance(): f_attendees = post_data['freshmen'] timestamp = post_data['timestamp'] + log.info('Submit {} Meeting Attendance'.format(committee)) + timestamp = datetime.strptime(timestamp, "%Y-%m-%d") meeting = CommitteeMeeting(committee, timestamp, approved) @@ -196,15 +190,11 @@ def submit_committee_attendance(): db.session.refresh(meeting) for m in m_attendees: - logger.info('backend', - action=("gave attendance to %s for %s" % (m, committee)) - ) + log.info('Gave Attendance to {} for {}'.format(m, committee)) db.session.add(MemberCommitteeAttendance(m, meeting.id)) for f in f_attendees: - logger.info('backend', - action=("gave attendance to freshman-%s for %s" % (f, committee)) - ) + log.info('Gave Attendance to freshman-{} for {}'.format(f, committee)) db.session.add(FreshmanCommitteeAttendance(f, meeting.id)) db.session.commit() @@ -213,10 +203,8 @@ def submit_committee_attendance(): @attendance_bp.route('/attendance/submit/ts', methods=['POST']) def submit_seminar_attendance(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4()) - ) - log.info('api', action='submit technical seminar attendance') + log = logger.new(request=request) + log.info('Submit Technical Seminar Attendance') user_name = request.headers.get('x-webauth-user') @@ -238,15 +226,11 @@ def submit_seminar_attendance(): db.session.refresh(seminar) for m in m_attendees: - logger.info('backend', - action=("gave attendance to %s for %s" % (m, seminar_name)) - ) + log.info('Gave Attendance to {} for {}'.format(m, seminar_name)) db.session.add(MemberSeminarAttendance(m, seminar.id)) for f in f_attendees: - logger.info('backend', - action=("gave attendance to freshman-%s for %s" % (f, seminar_name)) - ) + log.info('Gave Attendance to freshman-{} for {}'.format(f, seminar_name)) db.session.add(FreshmanSeminarAttendance(f, seminar.id)) db.session.commit() @@ -255,9 +239,8 @@ def submit_seminar_attendance(): @attendance_bp.route('/attendance/submit/hm', methods=['POST']) def submit_house_attendance(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='submit house meeting attendance') + log = logger.new(request=request) + log.info('Submit House Meeting Attendance') # status: Attended | Excused | Absent @@ -279,11 +262,10 @@ def submit_house_attendance(): if "members" in post_data: for m in post_data['members']: - logger.info('backend', - action=( - "gave %s to %s for %s house meeting" % ( - m['status'], m['uid'], timestamp.strftime("%Y-%m-%d"))) - ) + log.info('Marked {} {} for House Meeting on {}'.format( + m['uid'], + m['status'], + timestamp.strftime("%Y-%m-%d"))) db.session.add(MemberHouseMeetingAttendance( m['uid'], meeting.id, @@ -292,10 +274,10 @@ def submit_house_attendance(): if "freshmen" in post_data: for f in post_data['freshmen']: - logger.info('backend', - action=("gave %s to freshman-%s for %s house meeting" % ( - f['status'], f['id'], timestamp.strftime("%Y-%m-%d"))) - ) + log.info('Marked freshman-{} {} for House Meeting on {}'.format( + f['id'], + f['status'], + timestamp.strftime("%Y-%m-%d"))) db.session.add(FreshmanHouseMeetingAttendance( f['id'], meeting.id, @@ -308,6 +290,7 @@ def submit_house_attendance(): @attendance_bp.route('/attendance/alter/hm//', methods=['GET']) def alter_house_attendance(uid, hid): + log = logger.new(request=request) user_name = request.headers.get('x-webauth-user') account = ldap_get_member(user_name) @@ -315,6 +298,7 @@ def alter_house_attendance(uid, hid): return "must be evals", 403 if not uid.isdigit(): + log.info('Mark {} Present for House Meeting ID: {}'.format(uid, hid)) member_meeting = MemberHouseMeetingAttendance.query.filter( MemberHouseMeetingAttendance.uid == uid, MemberHouseMeetingAttendance.meeting_id == hid @@ -323,6 +307,7 @@ def alter_house_attendance(uid, hid): db.session.commit() return jsonify({"success": True}), 200 + log.info('Mark freshman-{} Present for House Meeting ID: {}'.format(uid, hid)) freshman_meeting = FreshmanHouseMeetingAttendance.query.filter( FreshmanHouseMeetingAttendance.fid == uid, FreshmanHouseMeetingAttendance.meeting_id == hid @@ -335,9 +320,7 @@ def alter_house_attendance(uid, hid): @attendance_bp.route('/attendance/alter/hm//', methods=['POST']) def alter_house_excuse(uid, hid): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='edit house meeting excuse') + log = logger.new(request=request) user_name = request.headers.get('x-webauth-user') @@ -349,10 +332,10 @@ def alter_house_excuse(uid, hid): hm_status = post_data['status'] hm_excuse = post_data['excuse'] - logger.info('backend', action="edit hm %s status: %s excuse: %s" % - (hid, hm_status, hm_excuse)) + if not uid.isdigit(): + log.info('Mark {} as {} for HM ID: {}'.format(uid, hm_status, hid)) MemberHouseMeetingAttendance.query.filter( MemberHouseMeetingAttendance.uid == uid, MemberHouseMeetingAttendance.meeting_id == hid @@ -361,6 +344,7 @@ def alter_house_excuse(uid, hid): 'attendance_status': hm_status }) else: + log.info('Mark {} as {} for HM ID: {}'.format(uid, hm_status, hid)) FreshmanHouseMeetingAttendance.query.filter( FreshmanHouseMeetingAttendance.fid == uid, FreshmanHouseMeetingAttendance.meeting_id == hid @@ -402,72 +386,70 @@ def get_seminar_attendees(meeting_id): FreshmanAccount.id == freshman).first().name) return attendees - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) + log = logger.new(request=request) user_name = request.headers.get('x-webauth-user') account = ldap_get_member(user_name) if not ldap_is_eboard(account): return "must be eboard", 403 - if request.method == 'GET': - page = request.args.get('page', 1) - log.info('api', action='view past attendance submitions') - offset = 0 if int(page) == 1 else ((int(page)-1)*10) - limit = int(page)*10 - all_cm = [{"id": m.id, - "name": m.committee, - "dt_obj": m.timestamp, - "date": m.timestamp.strftime("%a %m/%d/%Y"), - "attendees": get_meeting_attendees(m.id), - "type": "cm" - } for m in CommitteeMeeting.query.filter( - CommitteeMeeting.timestamp > start_of_year(), - CommitteeMeeting.approved).all()] - all_ts = [{"id": m.id, - "name": m.name, - "dt_obj": m.timestamp, - "date": m.timestamp.strftime("%a %m/%d/%Y"), - "attendees": get_seminar_attendees(m.id), - "type": "ts" - } for m in TechnicalSeminar.query.filter( - TechnicalSeminar.timestamp > start_of_year(), - TechnicalSeminar.approved).all()] - pend_cm = [{"id": m.id, - "name": m.committee, - "dt_obj": m.timestamp, - "date": m.timestamp.strftime("%a %m/%d/%Y"), - "attendees": get_meeting_attendees(m.id) - } for m in CommitteeMeeting.query.filter( - CommitteeMeeting.timestamp > start_of_year(), - CommitteeMeeting.approved == False).all()] # pylint: disable=singleton-comparison - pend_ts = [{"id": m.id, - "name": m.name, - "dt_obj": m.timestamp, - "date": m.timestamp.strftime("%a %m/%d/%Y"), - "attendees": get_seminar_attendees(m.id) - } for m in TechnicalSeminar.query.filter( - TechnicalSeminar.timestamp > start_of_year(), - TechnicalSeminar.approved == False).all()] # pylint: disable=singleton-comparison - all_meetings = sorted((all_cm + all_ts), key=lambda k: k['dt_obj'], reverse=True)[offset:limit] - if len(all_cm) % 10 != 0: - total_pages = (int(len(all_cm) / 10) + 1) - else: - total_pages = (int(len(all_cm) / 10)) - return render_template(request, - 'attendance_history.html', - username=user_name, - history=all_meetings, - pending_cm=pend_cm, - pending_ts=pend_ts, - num_pages=total_pages, - current_page=int(page)) + + page = request.args.get('page', 1) + log.info('View Past Attendance Submitions') + offset = 0 if int(page) == 1 else ((int(page)-1)*10) + limit = int(page)*10 + all_cm = [{"id": m.id, + "name": m.committee, + "dt_obj": m.timestamp, + "date": m.timestamp.strftime("%a %m/%d/%Y"), + "attendees": get_meeting_attendees(m.id), + "type": "cm" + } for m in CommitteeMeeting.query.filter( + CommitteeMeeting.timestamp > start_of_year(), + CommitteeMeeting.approved).all()] + all_ts = [{"id": m.id, + "name": m.name, + "dt_obj": m.timestamp, + "date": m.timestamp.strftime("%a %m/%d/%Y"), + "attendees": get_seminar_attendees(m.id), + "type": "ts" + } for m in TechnicalSeminar.query.filter( + TechnicalSeminar.timestamp > start_of_year(), + TechnicalSeminar.approved).all()] + pend_cm = [{"id": m.id, + "name": m.committee, + "dt_obj": m.timestamp, + "date": m.timestamp.strftime("%a %m/%d/%Y"), + "attendees": get_meeting_attendees(m.id) + } for m in CommitteeMeeting.query.filter( + CommitteeMeeting.timestamp > start_of_year(), + CommitteeMeeting.approved == False).all()] # pylint: disable=singleton-comparison + pend_ts = [{"id": m.id, + "name": m.name, + "dt_obj": m.timestamp, + "date": m.timestamp.strftime("%a %m/%d/%Y"), + "attendees": get_seminar_attendees(m.id) + } for m in TechnicalSeminar.query.filter( + TechnicalSeminar.timestamp > start_of_year(), + TechnicalSeminar.approved == False).all()] # pylint: disable=singleton-comparison + all_meetings = sorted((all_cm + all_ts), key=lambda k: k['dt_obj'], reverse=True)[offset:limit] + if len(all_cm) % 10 != 0: + total_pages = (int(len(all_cm) / 10) + 1) + else: + total_pages = (int(len(all_cm) / 10)) + return render_template(request, + 'attendance_history.html', + username=user_name, + history=all_meetings, + pending_cm=pend_cm, + pending_ts=pend_ts, + num_pages=total_pages, + current_page=int(page)) @attendance_bp.route('/attendance/alter/cm/', methods=['POST']) def alter_committee_attendance(cid): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='edit committee meeting attendance') + log = logger.new(request=request) + log.info('Edit Committee Meeting Attendance') user_name = request.headers.get('x-webauth-user') @@ -499,9 +481,8 @@ def alter_committee_attendance(cid): @attendance_bp.route('/attendance/alter/ts/', methods=['POST']) def alter_seminar_attendance(sid): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='edit technical seminar attendance') + log = logger.new(request=request) + log.info('Edit Technical Seminar Attendance') user_name = request.headers.get('x-webauth-user') @@ -548,9 +529,8 @@ def get_cm_attendees(sid): return jsonify({"attendees": attendees}), 200 elif request.method == 'DELETE': - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='delete technical seminar') + log = logger.new(request=request) + log.info('Delete Technical Seminar {}'.format(sid)) user_name = request.headers.get('x-webauth-user') @@ -588,9 +568,8 @@ def get_ts_attendees(cid): return jsonify({"attendees": attendees}), 200 elif request.method == 'DELETE': - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='delete committee meeting') + log = logger.new(request=request) + log.info('Delete Committee Meeting {}'.format(cid)) user_name = request.headers.get('x-webauth-user') @@ -613,9 +592,8 @@ def get_ts_attendees(cid): @attendance_bp.route('/attendance/cm//approve', methods=['POST']) def approve_cm(cid): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='approve committee meeting attendance') + log = logger.new(request=request) + log.info('Approve Committee Meeting {} Attendance'.format(cid)) user_name = request.headers.get('x-webauth-user') @@ -633,9 +611,8 @@ def approve_cm(cid): @attendance_bp.route('/attendance/ts//approve', methods=['POST']) def approve_ts(sid): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='approve committee meeting attendance') + log = logger.new(request=request) + log.info('Approve Technical Seminar {} Attendance'.format(sid)) user_name = request.headers.get('x-webauth-user') diff --git a/conditional/blueprints/cache_management.py b/conditional/blueprints/cache_management.py index 559063ad..aa89aaa9 100644 --- a/conditional/blueprints/cache_management.py +++ b/conditional/blueprints/cache_management.py @@ -30,7 +30,8 @@ def restart_app(): if not ldap_is_rtp(account): return redirect("/dashboard") - logger.info('api', action='restart conditional') + log = logger.new(request=request) + log.info('Restart Conditional') os.kill(os.getpid(), signal.SIGINT) return "application restarted", 200 @@ -43,7 +44,8 @@ def clear_cache(): if not ldap_is_eval_director(account) or not ldap_is_rtp(account): return redirect("/dashboard") - logger.info('api', action='purge system cache') + log = logger.new(request=request) + log.info('Purge All Caches') _ldap_is_member_of_directorship.cache_clear() ldap_get_member.cache_clear() diff --git a/conditional/blueprints/co_op.py b/conditional/blueprints/co_op.py index d2b7799c..9dbe8c3f 100644 --- a/conditional/blueprints/co_op.py +++ b/conditional/blueprints/co_op.py @@ -1,4 +1,3 @@ -import uuid import structlog from flask import Blueprint, request, jsonify @@ -17,9 +16,8 @@ @co_op_bp.route('/co_op/') def display_co_op_form(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('frontend', action='display co-op submission page') + log = logger.new(request=request) + log.info('Display Co-Op Submission Page') # get user data user_name = request.headers.get('x-webauth-user') @@ -35,15 +33,14 @@ def display_co_op_form(): @co_op_bp.route('/co_op/submit', methods=['POST']) def submit_co_op_form(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) + log = logger.new(request=request) user_name = request.headers.get('x-webauth-user') post_data = request.get_json() semester = post_data['semester'] - log.info('api', action='Submit %s Co-Op' % semester) + log.info('Submit {} Co-Op'.format(semester)) if CurrentCoops.query.filter(CurrentCoops.uid == user_name, CurrentCoops.date_created > start_of_year()).first(): return "User has already submitted this form!", 403 @@ -58,8 +55,7 @@ def submit_co_op_form(): @co_op_bp.route('/co_op/', methods=['DELETE']) def delete_co_op(uid): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) + log = logger.new(request=request) username = request.headers.get('x-webauth-user') account = ldap_get_member(username) @@ -67,7 +63,7 @@ def delete_co_op(uid): if not ldap_is_eval_director(account): return "must be eval director", 403 - log.info('api', action="Delete %s's Co-Op" % uid) + log.info('Delete {}\'s Co-Op'.format(uid)) CurrentCoops.query.filter(CurrentCoops.uid == uid, CurrentCoops.date_created > start_of_year()).delete() diff --git a/conditional/blueprints/conditional.py b/conditional/blueprints/conditional.py index 4664c3de..52696fc7 100644 --- a/conditional/blueprints/conditional.py +++ b/conditional/blueprints/conditional.py @@ -1,5 +1,3 @@ -import uuid - from datetime import datetime import structlog @@ -21,9 +19,8 @@ @conditionals_bp.route('/conditionals/') def display_conditionals(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('frontend', action='display conditional listing page') + log = logger.new(request=request) + log.info('Display Conditional Listing Page') # get user data user_name = request.headers.get('x-webauth-user') @@ -48,9 +45,7 @@ def display_conditionals(): @conditionals_bp.route('/conditionals/create', methods=['POST']) def create_conditional(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='create new conditional') + log = logger.new(request=request) user_name = request.headers.get('x-webauth-user') account = ldap_get_member(user_name) @@ -63,6 +58,7 @@ def create_conditional(): uid = post_data['uid'] description = post_data['description'] due_date = datetime.strptime(post_data['dueDate'], "%Y-%m-%d") + log.info('Create a new conditional for {}'.format(uid)) if post_data['evaluation'] == 'spring': current_eval = SpringEval.query.filter(SpringEval.status == "Pending", SpringEval.uid == uid, @@ -87,9 +83,7 @@ def create_conditional(): @conditionals_bp.route('/conditionals/review', methods=['POST']) def conditional_review(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='review a conditional') + log = logger.new(request=request) # get user data user_name = request.headers.get('x-webauth-user') @@ -102,7 +96,7 @@ def conditional_review(): cid = post_data['id'] status = post_data['status'] - logger.info(action="updated conditional-%s to %s" % (cid, status)) + log.info('Updated conditional-{} to {}'.format(cid, status)) conditional = Conditional.query.filter(Conditional.id == cid) cond_obj = conditional.first() @@ -128,9 +122,8 @@ def conditional_review(): @conditionals_bp.route('/conditionals/delete/', methods=['DELETE']) def conditional_delete(cid): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='delete conditional') + log = logger.new(request=request) + log.info('Delete conditional-{}'.format(cid)) user_name = request.headers.get('x-webauth-user') account = ldap_get_member(user_name) diff --git a/conditional/blueprints/dashboard.py b/conditional/blueprints/dashboard.py index d400830b..c598101f 100644 --- a/conditional/blueprints/dashboard.py +++ b/conditional/blueprints/dashboard.py @@ -1,4 +1,3 @@ -import uuid import structlog from flask import Blueprint, request @@ -29,9 +28,8 @@ @dashboard_bp.route('/dashboard/') def display_dashboard(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('frontend', action='display dashboard') + log = logger.new(request=request) + log.info('display dashboard') # Get username from headers. username = request.headers.get('x-webauth-user') diff --git a/conditional/blueprints/housing.py b/conditional/blueprints/housing.py index f7382ff5..8aec1eb0 100644 --- a/conditional/blueprints/housing.py +++ b/conditional/blueprints/housing.py @@ -1,4 +1,3 @@ -import uuid import structlog from flask import Blueprint, request, jsonify @@ -25,9 +24,8 @@ @housing_bp.route('/housing') def display_housing(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('frontend', action='display housing') + log = logger.new(request=request) + log.info('Display Housing Board') # get user data user_name = request.headers.get('x-webauth-user') @@ -71,9 +69,8 @@ def display_housing(): @housing_bp.route('/housing/in_queue', methods=['PUT']) def change_queue_state(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='add or remove member from housing queue') + log = logger.new(request=request) + username = request.headers.get('x-webauth-user') account = ldap_get_member(username) @@ -86,9 +83,11 @@ def change_queue_state(): if uid: if post_data.get('inQueue', False): + log.info('Add {} to Housing Queue'.format(uid)) queue_obj = InHousingQueue(uid=uid) db.session.add(queue_obj) else: + log.info('Remove {} from Housing Queue'.format(uid)) InHousingQueue.query.filter_by(uid=uid).delete() db.session.flush() @@ -98,9 +97,7 @@ def change_queue_state(): @housing_bp.route('/housing/update/', methods=['POST']) def change_room_numbers(rmnumber): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='mass housing update') + log = logger.new(request=request) username = request.headers.get('x-webauth-user') account = ldap_get_member(username) @@ -118,15 +115,15 @@ def change_room_numbers(rmnumber): if occupant != "": account = ldap_get_member(occupant) account.roomNumber = rmnumber - log.info('api', action='%s assigned to room %s' % (occupant, rmnumber)) + log.info('{} assigned to room {}'.format(occupant, rmnumber)) ldap_set_active(account) - log.info('api', action='%s marked as active because of room assignment' % occupant) + log.info('{} marked as active because of room assignment'.format(occupant)) # Delete any old occupants that are no longer in room. for old_occupant in [account for account in current_students if ldap_get_roomnumber(account) == str(rmnumber) and account.uid not in update["occupants"]]: + log.info('{} removed from room {}'.format(old_occupant.uid, old_occupant.roomNumber)) old_occupant.roomNumber = None - log.info('api', action='%s removed from room' % old_occupant.uid) return jsonify({"success": True}), 200 @@ -145,9 +142,7 @@ def get_occupants(rmnumber): @housing_bp.route('/housing', methods=['DELETE']) def clear_all_rooms(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='clear all room numbers') + log = logger.new(request=request) username = request.headers.get('x-webauth-user') account = ldap_get_member(username) @@ -159,6 +154,6 @@ def clear_all_rooms(): # Find the current occupants and clear them. for occupant in current_students: - log.info('api', action='remove room %s from %s' % (occupant.roomNumber, occupant.uid)) + log.info('{} removed from room {}'.format(occupant.uid, occupant.roomNumber)) occupant.roomNumber = None return jsonify({"success": True}), 200 diff --git a/conditional/blueprints/intro_evals.py b/conditional/blueprints/intro_evals.py index 50d24a86..cd11732b 100644 --- a/conditional/blueprints/intro_evals.py +++ b/conditional/blueprints/intro_evals.py @@ -1,5 +1,5 @@ from datetime import datetime -import uuid + import structlog from flask import Blueprint, request @@ -29,9 +29,8 @@ @intro_evals_bp.route('/intro_evals/') def display_intro_evals(internal=False): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('frontend', action='display intro evals listing') + log = logger.new(request=request) + log.info('Display Intro Evals Listing') # get user data def get_fid_cm_count(member_id): diff --git a/conditional/blueprints/intro_evals_form.py b/conditional/blueprints/intro_evals_form.py index 6a3910c6..4eb9e082 100644 --- a/conditional/blueprints/intro_evals_form.py +++ b/conditional/blueprints/intro_evals_form.py @@ -1,4 +1,3 @@ -import uuid import structlog from flask import Blueprint, request, redirect, jsonify @@ -18,9 +17,8 @@ @intro_evals_form_bp.route('/intro_evals_form/') def display_intro_evals_form(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('frontend', action='display intro evals form') + log = logger.new(request=request) + log.info('Display Intro Evals Form') # get user data user_name = request.headers.get('x-webauth-user') @@ -42,9 +40,8 @@ def display_intro_evals_form(): @intro_evals_form_bp.route('/intro_evals/submit', methods=['POST']) def submit_intro_evals(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='submit intro evals form') + log = logger.new(request=request) + log.info('Submit Intro Evals Form') user_name = request.headers.get('x-webauth-user') diff --git a/conditional/blueprints/major_project_submission.py b/conditional/blueprints/major_project_submission.py index 978353c2..e8fd6be7 100644 --- a/conditional/blueprints/major_project_submission.py +++ b/conditional/blueprints/major_project_submission.py @@ -1,4 +1,3 @@ -import uuid import structlog from flask import Blueprint, request, jsonify, redirect @@ -20,9 +19,8 @@ @major_project_bp.route('/major_project/') def display_major_project(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('frontend', action='display major project form') + log = logger.new(request=request) + log.info('Display Major Project Page') # get user data @@ -53,9 +51,8 @@ def display_major_project(): @major_project_bp.route('/major_project/submit', methods=['POST']) def submit_major_project(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='submit major project') + log = logger.new(request=request) + log.info('Submit Major Project') user_name = request.headers.get('x-webauth-user') @@ -74,9 +71,7 @@ def submit_major_project(): @major_project_bp.route('/major_project/review', methods=['POST']) def major_project_review(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='review major project') + log = logger.new(request=request) # get user data user_name = request.headers.get('x-webauth-user') @@ -89,6 +84,8 @@ def major_project_review(): pid = post_data['id'] status = post_data['status'] + log.info('{} Major Project ID: {}'.format(status, pid)) + print(post_data) MajorProject.query.filter( MajorProject.id == pid). \ @@ -103,9 +100,8 @@ def major_project_review(): @major_project_bp.route('/major_project/delete/', methods=['DELETE']) def major_project_delete(pid): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='review major project') + log = logger.new(request=request) + log.info('Delete Major Project ID: {}'.format(pid)) # get user data user_name = request.headers.get('x-webauth-user') diff --git a/conditional/blueprints/member_management.py b/conditional/blueprints/member_management.py index abb047fb..7a5d30e9 100644 --- a/conditional/blueprints/member_management.py +++ b/conditional/blueprints/member_management.py @@ -1,6 +1,5 @@ import csv import io -import uuid from datetime import datetime @@ -55,9 +54,8 @@ @member_management_bp.route('/manage') def display_member_management(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('frontend', action='display member management') + log = logger.new(request=request) + log.info('Display Member Management') username = request.headers.get('x-webauth-user') account = ldap_get_member(username) @@ -108,9 +106,7 @@ def display_member_management(): @member_management_bp.route('/manage/settings', methods=['PUT']) def member_management_eval(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='submit site settings') + log = logger.new(request=request) username = request.headers.get('x-webauth-user') account = ldap_get_member(username) @@ -121,14 +117,14 @@ def member_management_eval(): post_data = request.get_json() if 'siteLockdown' in post_data: - logger.info('backend', action="changed site lockdown setting to %s" % post_data['siteLockdown']) + log.info('Changed Site Lockdown: {}'.format(post_data['siteLockdown'])) EvalSettings.query.update( { 'site_lockdown': post_data['siteLockdown'] }) if 'introForm' in post_data: - logger.info('backend', action="changed intro form setting to %s" % post_data['introForm']) + log.info('Changed Intro Form: {}'.format(post_data['introForm'])) EvalSettings.query.update( { 'intro_form_active': post_data['introForm'] @@ -141,9 +137,8 @@ def member_management_eval(): @member_management_bp.route('/manage/user', methods=['POST']) def member_management_adduser(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='add fid user') + log = logger.new(request=request) + username = request.headers.get('x-webauth-user') account = ldap_get_member(username) @@ -156,12 +151,12 @@ def member_management_adduser(): name = post_data['name'] onfloor_status = post_data['onfloor'] room_number = post_data['roomNumber'] + log.info('Create Freshman Account for {}'.format(name)) # empty room numbers should be NULL if room_number == "": room_number = None - logger.info('backend', action="add f_%s as onfloor: %s with room_number: %s" % (name, onfloor_status, room_number)) db.session.add(FreshmanAccount(name, onfloor_status, room_number)) db.session.flush() db.session.commit() @@ -172,6 +167,7 @@ def member_management_adduser(): def member_management_uploaduser(): username = request.headers.get('x-webauth-user') account = ldap_get_member(username) + log = logger.new(request=request) if not ldap_is_eval_director(account): return "must be eval director", 403 @@ -193,6 +189,7 @@ def member_management_uploaduser(): else: room_number = None + log.info('Create Freshman Account for {} via CSV Upload'.format(name)) db.session.add(FreshmanAccount(name, onfloor_status, room_number)) db.session.flush() @@ -204,9 +201,6 @@ def member_management_uploaduser(): @member_management_bp.route('/manage/user/', methods=['POST']) def member_management_edituser(uid): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='edit uid user') username = request.headers.get('x-webauth-user') account = ldap_get_member(username) @@ -214,50 +208,49 @@ def member_management_edituser(uid): if not ldap_is_eval_director(account) and not ldap_is_financial_director(account): return "must be eval director", 403 - post_data = request.get_json() - if not uid.isdigit(): - edit_uid(uid, username, post_data) + edit_uid(uid, request) else: - edit_fid(uid, post_data) + edit_fid(uid, request) db.session.flush() db.session.commit() return jsonify({"success": True}), 200 -def edit_uid(uid, username, post_data): - +def edit_uid(uid, flask_request): + log = logger.new(request=flask_request) + post_data = flask_request.get_json() account = ldap_get_member(uid) active_member = post_data['activeMember'] - current_account = ldap_get_member(username) - if ldap_is_eval_director(current_account): - room_number = post_data['roomNumber'] - onfloor_status = post_data['onfloorStatus'] - housing_points = post_data['housingPoints'] - logger.info('backend', action="edit %s room: %s onfloor: %s housepts %s" % - (uid, post_data['roomNumber'], post_data['onfloorStatus'], - post_data['housingPoints'])) - - ldap_set_roomnumber(account, room_number) - if onfloor_status: - # If a OnFloorStatusAssigned object exists, don't make another - if not ldap_is_member_of_group(account, "onfloor"): - db.session.add(OnFloorStatusAssigned(uid, datetime.now())) - ldap_add_member_to_group(account, "onfloor") - else: - for ofs in OnFloorStatusAssigned.query.filter(OnFloorStatusAssigned.uid == uid): - db.session.delete(ofs) - db.session.flush() - db.session.commit() + room_number = post_data['roomNumber'] + onfloor_status = post_data['onfloorStatus'] + housing_points = post_data['housingPoints'] + log.info('Edit {} - Room: {} On-Floor: {} Points: {}'.format( + uid, + post_data['roomNumber'], + post_data['onfloorStatus'], + post_data['housingPoints'])) + + ldap_set_roomnumber(account, room_number) + if onfloor_status: + # If a OnFloorStatusAssigned object exists, don't make another + if not ldap_is_member_of_group(account, "onfloor"): + db.session.add(OnFloorStatusAssigned(uid, datetime.now())) + ldap_add_member_to_group(account, "onfloor") + else: + for ofs in OnFloorStatusAssigned.query.filter(OnFloorStatusAssigned.uid == uid): + db.session.delete(ofs) + db.session.flush() + db.session.commit() - if ldap_is_member_of_group(account, "onfloor"): - ldap_remove_member_from_group(account, "onfloor") - ldap_set_housingpoints(account, housing_points) + if ldap_is_member_of_group(account, "onfloor"): + ldap_remove_member_from_group(account, "onfloor") + ldap_set_housingpoints(account, housing_points) # Only update if there's a diff - logger.info('backend', action="edit %s active: %s" % (uid, active_member)) + log.info('Set {} Active: {}'.format(uid, active_member)) if ldap_is_active(account) != active_member: if active_member: ldap_set_active(account) @@ -276,10 +269,15 @@ def edit_uid(uid, username, post_data): clear_members_cache() -def edit_fid(uid, post_data): - logger.info('backend', action="edit freshman account %s room: %s onfloor: %s eval_date: %s sig_missed %s" % - (uid, post_data['roomNumber'], post_data['onfloorStatus'], - post_data['evalDate'], post_data['sigMissed'])) +def edit_fid(uid, flask_request): + log = logger.new(request=flask_request) + post_data = flask_request.get_json() + log.info('Edit freshman-{} - Room: {} On-Floor: {} Eval: {} SigMiss: {}'.format( + uid, + post_data['roomNumber'], + post_data['onfloorStatus'], + post_data['evalDate'], + post_data['sigMissed'])) name = post_data['name'] @@ -307,9 +305,8 @@ def edit_fid(uid, post_data): @member_management_bp.route('/manage/user/', methods=['GET']) def member_management_getuserinfo(uid): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='retrieve user info') + log = logger.new(request=request) + log.info('Get {}\'s Information'.format(uid)) username = request.headers.get('x-webauth-user') account = ldap_get_member(username) @@ -394,9 +391,8 @@ def get_hm_date(hm_id): @member_management_bp.route('/manage/user/', methods=['DELETE']) def member_management_deleteuser(fid): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='edit fid user') + log = logger.new(request=request) + log.info('Delete freshman-{}'.format(fid)) username = request.headers.get('x-webauth-user') account = ldap_get_member(username) @@ -407,7 +403,7 @@ def member_management_deleteuser(fid): if not fid.isdigit(): return "can only delete freshman accounts", 400 - logger.info('backend', action="delete freshman account %s" % fid) + log.info('backend', action="delete freshman account %s" % fid) for fca in FreshmanCommitteeAttendance.query.filter(FreshmanCommitteeAttendance.fid == fid): db.session.delete(fca) @@ -430,9 +426,7 @@ def member_management_deleteuser(fid): # manually need to do this @member_management_bp.route('/manage/upgrade_user', methods=['POST']) def member_management_upgrade_user(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='convert fid to uid entry') + log = logger.new(request=request) username = request.headers.get('x-webauth-user') account = ldap_get_member(username) @@ -446,8 +440,8 @@ def member_management_upgrade_user(): uid = post_data['uid'] signatures_missed = post_data['sigsMissed'] - logger.info('backend', action="upgrade freshman-%s to %s sigsMissed: %s" % - (fid, uid, signatures_missed)) + log.info('Upgrade freshman-{} to Account: {}'.format(fid, uid)) + acct = FreshmanAccount.query.filter( FreshmanAccount.id == fid).first() @@ -471,8 +465,10 @@ def member_management_upgrade_user(): db.session.add(MemberHouseMeetingAttendance( uid, fhm.meeting_id, fhm.excuse, fhm.attendance_status)) else: - logger.info('backend', action="duplicate house meeting attendance! fid: %s, uid: %s, id: %s" % - (fid, uid, fhm.meeting_id)) + log.info('Duplicate house meeting attendance! fid: {}, uid: {}, id: {}'.format( + fid, + uid, + fhm.meeting_id)) db.session.delete(fhm) if acct.onfloor_status: @@ -494,9 +490,8 @@ def member_management_upgrade_user(): @member_management_bp.route('/manage/intro_project', methods=['GET']) def introductory_project(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='show introductory project management') + log = logger.new(request=request) + log.info('Display Freshmen Project Management') username = request.headers.get('x-webauth-user') account = ldap_get_member(username) @@ -512,9 +507,7 @@ def introductory_project(): @member_management_bp.route('/manage/intro_project', methods=['POST']) def introductory_project_submit(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='submit introductory project results') + log = logger.new(request=request) username = request.headers.get('x-webauth-user') account = ldap_get_member(username) @@ -537,7 +530,7 @@ def introductory_project_submit(): if intro_member['status'] not in ['Passed', 'Pending', 'Failed']: abort(400) - log.info('debug', action='setting status "' + intro_member['status'] + '" for ' + intro_member['uid']) + log.info('Freshmen Project {} for {}'.format(intro_member['status'], intro_member['uid'])) FreshmanEvalData.query.filter(FreshmanEvalData.uid == intro_member['uid']).update({ 'freshman_project': intro_member['status'] @@ -550,9 +543,8 @@ def introductory_project_submit(): @member_management_bp.route('/member/', methods=['GET']) def get_member(uid): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action="get {}'s information".format(uid)) + log = logger.new(request=request) + log.info('Get {}\'s Information'.format(uid)) username = request.headers.get('x-webauth-user') account = ldap_get_member(username) @@ -571,9 +563,7 @@ def get_member(uid): @member_management_bp.route('/manage/active', methods=['DELETE']) def clear_active_members(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='clear active group') + log = logger.new(request=request) username = request.headers.get('x-webauth-user') account = ldap_get_member(username) @@ -585,15 +575,14 @@ def clear_active_members(): # Clear the active group. for account in members: - log.info('api', action='remove %s from active status' % account.uid) + log.info('Remove {} from Active Status'.format(account.uid)) ldap_set_inactive(account) return jsonify({"success": True}), 200 @member_management_bp.route('/manage/current/', methods=['POST', 'DELETE']) def remove_current_student(uid): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) + log = logger.new(request=request) username = request.headers.get('x-webauth-user') @@ -604,19 +593,18 @@ def remove_current_student(uid): member = ldap_get_member(uid) if request.method == 'DELETE': - log.info('api', action='remove {} from current_student'.format(uid)) + log.info('Remove {} from Current Student'.format(uid)) ldap_set_non_current_student(member) elif request.method == 'POST': - log.info('api', action='add {} to current_student'.format(uid)) + log.info('Add {} to Current Students'.format(uid)) ldap_set_current_student(member) return jsonify({"success": True}), 200 @member_management_bp.route('/manage/new', methods=['GET']) def new_year(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='show new year page') + log = logger.new(request=request) + log.info('Display New Year Page') username = request.headers.get('x-webauth-user') account = ldap_get_member(username) diff --git a/conditional/blueprints/slideshow.py b/conditional/blueprints/slideshow.py index 5ed0055b..63e25944 100644 --- a/conditional/blueprints/slideshow.py +++ b/conditional/blueprints/slideshow.py @@ -1,5 +1,4 @@ import json -import uuid from datetime import datetime @@ -26,9 +25,8 @@ @slideshow_bp.route('/slideshow/intro') def slideshow_intro_display(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('frontend', action='display intro slideshow') + log = logger.new(request=request) + log.info('Display Intro Slideshow') user_name = request.headers.get('x-webauth-user') account = ldap_get_member(user_name) @@ -45,9 +43,8 @@ def slideshow_intro_display(): @slideshow_bp.route('/slideshow/intro/members') def slideshow_intro_members(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='retrieve intro members slideshow data') + log = logger.new(request=request) + log.info('Retrieve Intro Members Slideshow Data') # can't be jsonify because # ValueError: dictionary update sequence element #0 has length 7; 2 is @@ -57,9 +54,7 @@ def slideshow_intro_members(): @slideshow_bp.route('/slideshow/intro/review', methods=['POST']) def slideshow_intro_review(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='submit intro member evaluation') + log = logger.new(request=request) # get user data user_name = request.headers.get('x-webauth-user') @@ -72,7 +67,7 @@ def slideshow_intro_review(): uid = post_data['uid'] status = post_data['status'] - logger.info("backend", action="submit intro eval for %s status: %s" % (uid, status)) + log.info('Intro Eval for {}: {}'.format(uid, status)) FreshmanEvalData.query.filter( FreshmanEvalData.uid == uid and FreshmanEvalData.active). \ @@ -88,9 +83,8 @@ def slideshow_intro_review(): @slideshow_bp.route('/slideshow/spring') def slideshow_spring_display(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('frontend', action='display membership evaluations slideshow') + log = logger.new(request=request) + log.info('Display Membership Evaluations Slideshow') user_name = request.headers.get('x-webauth-user') account = ldap_get_member(user_name) @@ -107,9 +101,8 @@ def slideshow_spring_display(): @slideshow_bp.route('/slideshow/spring/members') def slideshow_spring_members(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='retreive membership evaluations slideshow daat') + log = logger.new(request=request) + log.info('Retreive Membership Evaluations Slideshow Data') # can't be jsonify because # ValueError: dictionary update sequence element #0 has length 7; 2 is @@ -119,9 +112,7 @@ def slideshow_spring_members(): @slideshow_bp.route('/slideshow/spring/review', methods=['POST']) def slideshow_spring_review(): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('api', action='submit membership evaulation') + log = logger.new(request=request) # get user data user_name = request.headers.get('x-webauth-user') @@ -134,7 +125,7 @@ def slideshow_spring_review(): uid = post_data['uid'] status = post_data['status'] - logger.info("backend", action="submit spring eval for %s status: %s" % (uid, status)) + log.info('Spring Eval for {}: {}'.format(uid, status)) SpringEval.query.filter( SpringEval.uid == uid and diff --git a/conditional/blueprints/spring_evals.py b/conditional/blueprints/spring_evals.py index 4a93a59b..eb0eabe5 100644 --- a/conditional/blueprints/spring_evals.py +++ b/conditional/blueprints/spring_evals.py @@ -1,4 +1,3 @@ -import uuid import structlog from flask import Blueprint, request @@ -23,9 +22,8 @@ @spring_evals_bp.route('/spring_evals/') def display_spring_evals(internal=False): - log = logger.new(user_name=request.headers.get("x-webauth-user"), - request_id=str(uuid.uuid4())) - log.info('frontend', action='display membership evaluations listing') + log = logger.new(request=request) + log.info('Display Membership Evaluations Listing') user_name = None if not internal: diff --git a/conditional/models/models.py b/conditional/models/models.py index 62c09022..aecbdac6 100644 --- a/conditional/models/models.py +++ b/conditional/models/models.py @@ -2,6 +2,7 @@ from datetime import date, timedelta, datetime from sqlalchemy import Column, Integer, String, Enum, ForeignKey, DateTime, \ Date, Text, Boolean +from sqlalchemy.dialects import postgresql from conditional import db attendance_enum = Enum('Attended', 'Excused', 'Absent', name='attendance_enum') @@ -269,3 +270,25 @@ def __init__(self, uid): class InHousingQueue(db.Model): __tablename__ = 'in_housing_queue' uid = Column(String(32), primary_key=True) + +http_enum = Enum('GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'CONNECT', 'OPTIONS', 'TRACE', 'PATCH', name='http_enum') + +class UserLog(db.Model): + __tablename__ = 'user_log' + id = Column(Integer, primary_key=True) + ipaddr = Column(postgresql.INET, nullable=False) + timestamp = Column(DateTime, nullable=False) + uid = Column(String(32), nullable=False) + method = Column(http_enum) + blueprint = Column(String(32), nullable=False) + path = Column(String(128), nullable=False) + description = Column(String(128), nullable=False) + + def __init__(self, ipaddr, user, method, blueprint, path, description): + self.ipaddr = ipaddr + self.timestamp = datetime.now() + self.uid = user + self.method = method + self.blueprint = blueprint + self.path = path + self.description = description