Skip to content

Commit 6abd03b

Browse files
authored
Conditional v1.3.1 (#119)
* Member Submission of Attendance (#116) * Fix Eboard Check and Frsmn Migration * Add Approved Field and Migration Titles * Committee Meeting Submtn and Review * Technical Seminar Atnd Smbtn * Spelling is hard. * Display Seminars on History Page * removed initial attendance submission warning (#118) * Fix Dashboard for those with no housing info
1 parent 28d2288 commit 6abd03b

17 files changed

+342
-53
lines changed

conditional/blueprints/attendance.py

+175-25
Original file line numberDiff line numberDiff line change
@@ -128,14 +128,9 @@ def display_attendance_cm():
128128
request_id=str(uuid.uuid4()))
129129
log.info('frontend', action='display committee meeting attendance page')
130130

131-
user_name = request.headers.get('x-webauth-user')
132-
account = ldap_get_member(user_name)
133-
if not ldap_is_eboard(account):
134-
return redirect("/dashboard")
135-
136131
return render_template(request,
137132
'attendance_cm.html',
138-
username=user_name,
133+
username=request.headers.get("x-webauth-user"),
139134
date=datetime.now().strftime("%Y-%m-%d"))
140135

141136

@@ -145,14 +140,9 @@ def display_attendance_ts():
145140
request_id=str(uuid.uuid4()))
146141
log.info('frontend', action='display technical seminar attendance page')
147142

148-
user_name = request.headers.get('x-webauth-user')
149-
account = ldap_get_member(user_name)
150-
if not ldap_is_eboard(account):
151-
return redirect("/dashboard")
152-
153143
return render_template(request,
154144
'attendance_ts.html',
155-
username=user_name,
145+
username=request.headers.get("x-webauth-user"),
156146
date=datetime.now().strftime("%Y-%m-%d"))
157147

158148

@@ -182,9 +172,7 @@ def submit_committee_attendance():
182172

183173
user_name = request.headers.get('x-webauth-user')
184174
account = ldap_get_member(user_name)
185-
if not ldap_is_eboard(account):
186-
return "must be eboard", 403
187-
175+
approved = ldap_is_eboard(account)
188176
post_data = request.get_json()
189177

190178
committee = post_data['committee']
@@ -193,7 +181,7 @@ def submit_committee_attendance():
193181
timestamp = post_data['timestamp']
194182

195183
timestamp = datetime.strptime(timestamp, "%Y-%m-%d")
196-
meeting = CommitteeMeeting(committee, timestamp)
184+
meeting = CommitteeMeeting(committee, timestamp, approved)
197185

198186
db.session.add(meeting)
199187
db.session.flush()
@@ -225,8 +213,7 @@ def submit_seminar_attendance():
225213
user_name = request.headers.get('x-webauth-user')
226214

227215
account = ldap_get_member(user_name)
228-
if not ldap_is_eboard(account):
229-
return "must be eboard", 403
216+
approved = ldap_is_eboard(account)
230217

231218
post_data = request.get_json()
232219

@@ -236,7 +223,7 @@ def submit_seminar_attendance():
236223
timestamp = post_data['timestamp']
237224

238225
timestamp = datetime.strptime(timestamp, "%Y-%m-%d")
239-
seminar = TechnicalSeminar(seminar_name, timestamp)
226+
seminar = TechnicalSeminar(seminar_name, timestamp, approved)
240227

241228
db.session.add(seminar)
242229
db.session.flush()
@@ -395,6 +382,18 @@ def get_meeting_attendees(meeting_id):
395382
FreshmanAccount.id == freshman).first().name)
396383
return attendees
397384

385+
def get_seminar_attendees(meeting_id):
386+
attendees = [ldap_get_member(a.uid).displayName for a in
387+
MemberSeminarAttendance.query.filter(
388+
MemberSeminarAttendance.seminar_id == meeting_id).all()]
389+
390+
for freshman in [a.fid for a in
391+
FreshmanSeminarAttendance.query.filter(
392+
FreshmanSeminarAttendance.seminar_id == meeting_id).all()]:
393+
attendees.append(FreshmanAccount.query.filter(
394+
FreshmanAccount.id == freshman).first().name)
395+
return attendees
396+
398397
log = logger.new(user_name=request.headers.get("x-webauth-user"),
399398
request_id=str(uuid.uuid4()))
400399

@@ -409,20 +408,46 @@ def get_meeting_attendees(meeting_id):
409408
offset = 0 if int(page) == 1 else ((int(page)-1)*10)
410409
limit = int(page)*10
411410
all_cm = [{"id": m.id,
412-
"directorship": m.committee,
411+
"name": m.committee,
413412
"dt_obj": m.timestamp,
414413
"date": m.timestamp.strftime("%a %m/%d/%Y"),
415-
"attendees": get_meeting_attendees(m.id)
416-
} for m in CommitteeMeeting.query.all()]
417-
c_meetings = sorted(all_cm, key=lambda k: k['dt_obj'], reverse=True)[offset:limit]
414+
"attendees": get_meeting_attendees(m.id),
415+
"type": "cm"
416+
} for m in CommitteeMeeting.query.filter(
417+
CommitteeMeeting.approved).all()]
418+
all_ts = [{"id": m.id,
419+
"name": m.name,
420+
"dt_obj": m.timestamp,
421+
"date": m.timestamp.strftime("%a %m/%d/%Y"),
422+
"attendees": get_seminar_attendees(m.id),
423+
"type": "ts"
424+
} for m in TechnicalSeminar.query.filter(
425+
TechnicalSeminar.approved).all()]
426+
pend_cm = [{"id": m.id,
427+
"name": m.committee,
428+
"dt_obj": m.timestamp,
429+
"date": m.timestamp.strftime("%a %m/%d/%Y"),
430+
"attendees": get_meeting_attendees(m.id)
431+
} for m in CommitteeMeeting.query.filter(
432+
CommitteeMeeting.approved == False).all()] # pylint: disable=singleton-comparison
433+
pend_ts = [{"id": m.id,
434+
"name": m.name,
435+
"dt_obj": m.timestamp,
436+
"date": m.timestamp.strftime("%a %m/%d/%Y"),
437+
"attendees": get_seminar_attendees(m.id)
438+
} for m in TechnicalSeminar.query.filter(
439+
TechnicalSeminar.approved == False).all()] # pylint: disable=singleton-comparison
440+
all_meetings = sorted((all_cm + all_ts), key=lambda k: k['dt_obj'], reverse=True)[offset:limit]
418441
if len(all_cm) % 10 != 0:
419442
total_pages = (int(len(all_cm) / 10) + 1)
420443
else:
421444
total_pages = (int(len(all_cm) / 10))
422445
return render_template(request,
423446
'attendance_history.html',
424447
username=user_name,
425-
history=c_meetings,
448+
history=all_meetings,
449+
pending_cm=pend_cm,
450+
pending_ts=pend_ts,
426451
num_pages=total_pages,
427452
current_page=int(page))
428453

@@ -459,8 +484,83 @@ def alter_committee_attendance(cid):
459484
db.session.commit()
460485
return jsonify({"success": True}), 200
461486

487+
488+
@attendance_bp.route('/attendance/alter/ts/<sid>', methods=['POST'])
489+
def alter_seminar_attendance(sid):
490+
log = logger.new(user_name=request.headers.get("x-webauth-user"),
491+
request_id=str(uuid.uuid4()))
492+
log.info('api', action='edit technical seminar attendance')
493+
494+
user_name = request.headers.get('x-webauth-user')
495+
496+
account = ldap_get_member(user_name)
497+
if not ldap_is_eboard(account):
498+
return "must be eboard", 403
499+
500+
post_data = request.get_json()
501+
meeting_id = sid
502+
m_attendees = post_data['members']
503+
f_attendees = post_data['freshmen']
504+
505+
FreshmanSeminarAttendance.query.filter(
506+
FreshmanSeminarAttendance.seminar_id == meeting_id).delete()
507+
508+
MemberSeminarAttendance.query.filter(
509+
MemberSeminarAttendance.seminar_id == meeting_id).delete()
510+
511+
for m in m_attendees:
512+
db.session.add(MemberSeminarAttendance(m, meeting_id))
513+
514+
for f in f_attendees:
515+
db.session.add(FreshmanSeminarAttendance(f, meeting_id))
516+
517+
db.session.flush()
518+
db.session.commit()
519+
return jsonify({"success": True}), 200
520+
521+
522+
@attendance_bp.route('/attendance/ts/<sid>', methods=['GET', 'DELETE'])
523+
def get_cm_attendees(sid):
524+
if request.method == 'GET':
525+
attendees = [{"value": a.uid,
526+
"display": ldap_get_member(a.uid).displayName
527+
} for a in
528+
MemberSeminarAttendance.query.filter(
529+
MemberSeminarAttendance.seminar_id == sid).all()]
530+
531+
for freshman in [{"value": a.fid,
532+
"display": FreshmanAccount.query.filter(FreshmanAccount.id == a.fid).first().name
533+
} for a in FreshmanSeminarAttendance.query.filter(
534+
FreshmanSeminarAttendance.seminar_id == sid).all()]:
535+
attendees.append(freshman)
536+
return jsonify({"attendees": attendees}), 200
537+
538+
elif request.method == 'DELETE':
539+
log = logger.new(user_name=request.headers.get("x-webauth-user"),
540+
request_id=str(uuid.uuid4()))
541+
log.info('api', action='delete technical seminar')
542+
543+
user_name = request.headers.get('x-webauth-user')
544+
545+
account = ldap_get_member(user_name)
546+
if not ldap_is_eboard(account):
547+
return "must be eboard", 403
548+
549+
FreshmanSeminarAttendance.query.filter(
550+
FreshmanSeminarAttendance.seminar_id == sid).delete()
551+
MemberSeminarAttendance.query.filter(
552+
MemberSeminarAttendance.seminar_id == sid).delete()
553+
TechnicalSeminar.query.filter(
554+
TechnicalSeminar.id == sid).delete()
555+
556+
db.session.flush()
557+
db.session.commit()
558+
559+
return jsonify({"success": True}), 200
560+
561+
462562
@attendance_bp.route('/attendance/cm/<cid>', methods=['GET', 'DELETE'])
463-
def get_cm_attendees(cid):
563+
def get_ts_attendees(cid):
464564
if request.method == 'GET':
465565
attendees = [{"value": a.uid,
466566
"display": ldap_get_member(a.uid).displayName
@@ -476,6 +576,16 @@ def get_cm_attendees(cid):
476576
return jsonify({"attendees": attendees}), 200
477577

478578
elif request.method == 'DELETE':
579+
log = logger.new(user_name=request.headers.get("x-webauth-user"),
580+
request_id=str(uuid.uuid4()))
581+
log.info('api', action='delete committee meeting')
582+
583+
user_name = request.headers.get('x-webauth-user')
584+
585+
account = ldap_get_member(user_name)
586+
if not ldap_is_eboard(account):
587+
return "must be eboard", 403
588+
479589
FreshmanCommitteeAttendance.query.filter(
480590
FreshmanCommitteeAttendance.meeting_id == cid).delete()
481591
MemberCommitteeAttendance.query.filter(
@@ -487,3 +597,43 @@ def get_cm_attendees(cid):
487597
db.session.commit()
488598

489599
return jsonify({"success": True}), 200
600+
601+
602+
@attendance_bp.route('/attendance/cm/<cid>/approve', methods=['POST'])
603+
def approve_cm(cid):
604+
log = logger.new(user_name=request.headers.get("x-webauth-user"),
605+
request_id=str(uuid.uuid4()))
606+
log.info('api', action='approve committee meeting attendance')
607+
608+
user_name = request.headers.get('x-webauth-user')
609+
610+
account = ldap_get_member(user_name)
611+
if not ldap_is_eboard(account):
612+
return "must be eboard", 403
613+
614+
CommitteeMeeting.query.filter(
615+
CommitteeMeeting.id == cid).first().approved = True
616+
db.session.flush()
617+
db.session.commit()
618+
619+
return jsonify({"success": True}), 200
620+
621+
622+
@attendance_bp.route('/attendance/ts/<sid>/approve', methods=['POST'])
623+
def approve_ts(sid):
624+
log = logger.new(user_name=request.headers.get("x-webauth-user"),
625+
request_id=str(uuid.uuid4()))
626+
log.info('api', action='approve committee meeting attendance')
627+
628+
user_name = request.headers.get('x-webauth-user')
629+
630+
account = ldap_get_member(user_name)
631+
if not ldap_is_eboard(account):
632+
return "must be eboard", 403
633+
634+
TechnicalSeminar.query.filter(
635+
TechnicalSeminar.id == sid).first().approved = True
636+
db.session.flush()
637+
db.session.commit()
638+
639+
return jsonify({"success": True}), 200

conditional/blueprints/dashboard.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ def display_dashboard():
5858
c_meetings = [m.meeting_id for m in
5959
MemberCommitteeAttendance.query.filter(
6060
MemberCommitteeAttendance.uid == member.uid
61-
)]
61+
) if CommitteeMeeting.query.filter(
62+
CommitteeMeeting.id == m.meeting_id).first().approved]
6263
spring['committee_meetings'] = len(c_meetings)
6364
h_meetings = [(m.meeting_id, m.attendance_status) for m in
6465
MemberHouseMeetingAttendance.query.filter(

conditional/blueprints/member_management.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,8 @@ def member_management_upgrade_user():
469469
db.session.add(OnFloorStatusAssigned(uid, datetime.now()))
470470

471471
if acct.room_number:
472-
ldap_set_roomnumber(uid, acct.room_number)
472+
new_account = ldap_get_member(uid)
473+
ldap_set_roomnumber(new_account, acct.room_number)
473474

474475
db.session.delete(acct)
475476

conditional/models/models.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,13 @@ class CommitteeMeeting(db.Model):
5656
'R&D', 'House Improvements', 'Financial', 'Chairman', name="committees_enum"),
5757
nullable=False)
5858
timestamp = Column(DateTime, nullable=False)
59+
approved = Column(Boolean, nullable=False)
5960
active = Column(Boolean)
6061

61-
def __init__(self, committee, timestamp):
62+
def __init__(self, committee, timestamp, approved):
6263
self.committee = committee
6364
self.timestamp = timestamp
65+
self.approved = approved
6466
self.active = True
6567

6668

@@ -91,11 +93,13 @@ class TechnicalSeminar(db.Model):
9193
id = Column(Integer, primary_key=True)
9294
name = Column(String(128), nullable=False)
9395
timestamp = Column(DateTime, nullable=False)
96+
approved = Column(Boolean, nullable=False)
9497
active = Column(Boolean)
9598

96-
def __init__(self, name, timestamp):
99+
def __init__(self, name, timestamp, approved):
97100
self.name = name
98101
self.timestamp = timestamp
102+
self.approved = approved
99103
self.active = True
100104

101105

0 commit comments

Comments
 (0)