Skip to content

Commit 241afaf

Browse files
authored
Merge pull request #545 from Nil-32-0/develop
Track Technical Seminar Hosting
2 parents 78dd2e0 + af23e07 commit 241afaf

File tree

19 files changed

+486
-40
lines changed

19 files changed

+486
-40
lines changed

conditional/blueprints/attendance.py

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
from conditional.models.models import FreshmanCommitteeAttendance
1111
from conditional.models.models import FreshmanHouseMeetingAttendance
1212
from conditional.models.models import FreshmanSeminarAttendance
13+
from conditional.models.models import FreshmanSeminarHost
1314
from conditional.models.models import HouseMeeting
1415
from conditional.models.models import MemberCommitteeAttendance
1516
from conditional.models.models import MemberHouseMeetingAttendance
1617
from conditional.models.models import MemberSeminarAttendance
18+
from conditional.models.models import MemberSeminarHost
1719
from conditional.models.models import TechnicalSeminar
1820
from conditional.util.auth import get_user
1921
from conditional.util.flask import render_template
@@ -218,6 +220,8 @@ def submit_seminar_attendance(user_dict=None):
218220
seminar_name = post_data['name']
219221
m_attendees = post_data['members']
220222
f_attendees = post_data['freshmen']
223+
m_host = post_data['member_host']
224+
f_host = post_data['freshman_host']
221225
timestamp = post_data['timestamp']
222226

223227
timestamp = datetime.strptime(timestamp, "%Y-%m-%d")
@@ -228,12 +232,24 @@ def submit_seminar_attendance(user_dict=None):
228232
db.session.refresh(seminar)
229233

230234
for m in m_attendees:
235+
if m in m_host:
236+
log.info(f'Skipped giving Attendence to {m} for {seminar_name}')
237+
continue
231238
log.info(f'Gave Attendance to {m} for {seminar_name}')
232239
db.session.add(MemberSeminarAttendance(m, seminar.id))
240+
for m in m_host:
241+
log.info(f'Gave Host Credit to {m} for {seminar_name}')
242+
db.session.add(MemberSeminarHost(m, seminar.id))
233243

234244
for f in f_attendees:
245+
if f in f_host:
246+
log.info(f'Skipped giving Attendance to freshman-{f} for {seminar_name}')
247+
continue
235248
log.info(f'Gave Attendance to freshman-{f} for {seminar_name}')
236249
db.session.add(FreshmanSeminarAttendance(f, seminar.id))
250+
for f in f_host:
251+
log.info(f'Gave Host Credit to freshman-{f} for {seminar_name}')
252+
db.session.add(FreshmanSeminarHost(f, seminar.id))
237253

238254
db.session.commit()
239255
return jsonify({"success": True}), 200
@@ -379,6 +395,18 @@ def get_seminar_attendees(meeting_id):
379395
FreshmanAccount.id == freshman).first().name)
380396
return attendees
381397

398+
def get_seminar_hosts(meeting_id):
399+
hosts = [ldap_get_member(a.uid).displayName for a in
400+
MemberSeminarHost.query.filter(
401+
MemberSeminarHost.seminar_id == meeting_id).all()]
402+
403+
for freshman in [a.fid for a in
404+
FreshmanSeminarHost.query.filter(
405+
FreshmanSeminarHost.seminar_id == meeting_id).all()]:
406+
hosts.append(FreshmanAccount.query.filter(
407+
FreshmanAccount.id == freshman).first().name)
408+
return hosts
409+
382410
log = logger.new(request=request, auth_dict=user_dict)
383411

384412
if not user_dict_is_eboard(user_dict):
@@ -402,6 +430,7 @@ def get_seminar_attendees(meeting_id):
402430
"name": m.name,
403431
"dt_obj": m.timestamp,
404432
"date": m.timestamp.strftime("%a %m/%d/%Y"),
433+
"hosts": get_seminar_hosts(m.id),
405434
"attendees": get_seminar_attendees(m.id),
406435
"type": "ts"
407436
} for m in TechnicalSeminar.query.filter(
@@ -419,6 +448,7 @@ def get_seminar_attendees(meeting_id):
419448
"name": m.name,
420449
"dt_obj": m.timestamp,
421450
"date": m.timestamp.strftime("%a %m/%d/%Y"),
451+
"hosts": get_seminar_hosts(m.id),
422452
"attendees": get_seminar_attendees(m.id)
423453
} for m in TechnicalSeminar.query.filter(
424454
TechnicalSeminar.timestamp > start_of_year(),
@@ -433,6 +463,7 @@ def get_seminar_attendees(meeting_id):
433463
history=all_meetings,
434464
pending_cm=pend_cm,
435465
pending_ts=pend_ts,
466+
all_ts=all_ts,
436467
num_pages=total_pages,
437468
current_page=int(page))
438469

@@ -483,19 +514,37 @@ def alter_seminar_attendance(sid, user_dict=None):
483514
meeting_id = sid
484515
m_attendees = post_data['members']
485516
f_attendees = post_data['freshmen']
517+
m_host = post_data['member_host']
518+
f_host = post_data['freshman_host']
486519

487520
FreshmanSeminarAttendance.query.filter(
488521
FreshmanSeminarAttendance.seminar_id == meeting_id).delete()
489522

523+
FreshmanSeminarHost.query.filter(
524+
FreshmanSeminarHost.seminar_id == meeting_id).delete()
525+
490526
MemberSeminarAttendance.query.filter(
491527
MemberSeminarAttendance.seminar_id == meeting_id).delete()
492528

529+
MemberSeminarHost.query.filter(
530+
MemberSeminarHost.seminar_id == meeting_id).delete()
531+
493532
for m in m_attendees:
533+
if m in m_host:
534+
continue
494535
db.session.add(MemberSeminarAttendance(m, meeting_id))
495536

537+
for m in m_host:
538+
db.session.add(MemberSeminarHost(m, meeting_id))
539+
496540
for f in f_attendees:
541+
if f in f_host:
542+
continue
497543
db.session.add(FreshmanSeminarAttendance(f, meeting_id))
498544

545+
for f in f_host:
546+
db.session.add(FreshmanSeminarHost(f, meeting_id))
547+
499548
db.session.flush()
500549
db.session.commit()
501550
return jsonify({"success": True}), 200
@@ -512,12 +561,25 @@ def get_cm_attendees(sid, user_dict=None):
512561
MemberSeminarAttendance.query.filter(
513562
MemberSeminarAttendance.seminar_id == sid).all()]
514563

564+
host = [{"value": a.uid,
565+
"display": ldap_get_member(a.uid).displayName
566+
} for a in
567+
MemberSeminarHost.query.filter(
568+
MemberSeminarHost.seminar_id == sid).all()]
569+
515570
for freshman in [{"value": a.fid,
516571
"display": FreshmanAccount.query.filter(FreshmanAccount.id == a.fid).first().name
517572
} for a in FreshmanSeminarAttendance.query.filter(
518573
FreshmanSeminarAttendance.seminar_id == sid).all()]:
519574
attendees.append(freshman)
520-
return jsonify({"attendees": attendees}), 200
575+
576+
for freshman in [{"value": a.fid,
577+
"display": FreshmanAccount.query.filter(FreshmanAccount.id == a.fid).first().name
578+
} for a in FreshmanSeminarHost.query.filter(
579+
FreshmanSeminarHost.seminar_id == sid).all()]:
580+
host.append(freshman)
581+
582+
return jsonify({"attendees": attendees, "host": host}), 200
521583

522584
log = logger.new(request=request, auth_dict=user_dict)
523585
log.info(f'Delete Technical Seminar {sid}')
@@ -527,8 +589,12 @@ def get_cm_attendees(sid, user_dict=None):
527589

528590
FreshmanSeminarAttendance.query.filter(
529591
FreshmanSeminarAttendance.seminar_id == sid).delete()
592+
FreshmanSeminarHost.query.filter(
593+
FreshmanSeminarHost.seminar_id == sid).delete()
530594
MemberSeminarAttendance.query.filter(
531595
MemberSeminarAttendance.seminar_id == sid).delete()
596+
MemberSeminarHost.query.filter(
597+
MemberSeminarHost.seminar_id == sid).delete()
532598
TechnicalSeminar.query.filter(
533599
TechnicalSeminar.id == sid).delete()
534600

conditional/blueprints/dashboard.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from conditional.models.models import HouseMeeting
77
from conditional.models.models import MemberHouseMeetingAttendance
88
from conditional.models.models import MemberSeminarAttendance
9+
from conditional.models.models import MemberSeminarHost
910
from conditional.models.models import TechnicalSeminar
1011
from conditional.models.models import SpringEval
1112
from conditional.util.auth import get_user
@@ -106,11 +107,21 @@ def display_dashboard(user_dict=None):
106107
MemberSeminarAttendance.uid == uid,
107108
) if is_seminar_attendance_valid(s)]
108109
data['ts_total'] = len(t_seminars)
110+
# technical seminars hosted
111+
t_seminars_hosted = [s.seminar_id for s in
112+
MemberSeminarHost.query.filter(
113+
MemberSeminarHost.uid == uid,
114+
) if is_seminar_attendance_valid(s)]
115+
data['ts_hosted_total'] = len(t_seminars_hosted)
109116
attendance = [m.name for m in TechnicalSeminar.query.filter(
110117
TechnicalSeminar.id.in_(t_seminars)
111118
)]
119+
hosted = [m.name for m in TechnicalSeminar.query.filter(
120+
TechnicalSeminar.id.in_(t_seminars_hosted)
121+
)]
112122

113123
data['ts_list'] = attendance
124+
data['ts_hosted'] = hosted
114125

115126
spring['mp_status'] = "Failed"
116127
for mp in data['major_projects']:
@@ -164,6 +175,7 @@ def display_dashboard(user_dict=None):
164175
'status': gatekeep_result,
165176
'committee_meetings': gatekeep_info['c_meetings'],
166177
'technical_seminars': gatekeep_info['t_seminars'],
178+
'technical_seminars_hosted': gatekeep_info['t_seminars_hosted'],
167179
'hm_missed': gatekeep_info['h_meetings_missed']
168180
}
169181

conditional/blueprints/gatekeep.py

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from conditional import start_of_year, auth
66
from conditional.models.models import CommitteeMeeting, HouseMeeting, MemberCommitteeAttendance, \
7-
MemberSeminarAttendance, TechnicalSeminar
7+
MemberSeminarAttendance, MemberSeminarHost, TechnicalSeminar
88
from conditional.models.models import MemberHouseMeetingAttendance
99
from conditional.util.auth import get_user
1010
from conditional.util.flask import render_template
@@ -59,6 +59,23 @@ def display_spring_evals(internal=False, user_dict=None):
5959
MemberSeminarAttendance.uid
6060
).all()}
6161

62+
ts_host_count = {row[0]: row[1] for row in MemberSeminarHost.query.join(
63+
TechnicalSeminar,
64+
MemberSeminarHost.seminar_id == TechnicalSeminar.id
65+
).with_entities(
66+
MemberSeminarHost.uid,
67+
TechnicalSeminar.timestamp,
68+
TechnicalSeminar.approved,
69+
).filter(
70+
TechnicalSeminar.approved,
71+
TechnicalSeminar.timestamp >= semester_start
72+
).with_entities(
73+
MemberSeminarHost.uid,
74+
func.count(MemberSeminarHost.uid) #pylint: disable=not-callable
75+
).group_by(
76+
MemberSeminarHost.uid
77+
).all()}
78+
6279
hm_missed = {row[0]: row[1] for row in MemberHouseMeetingAttendance.query.join(
6380
HouseMeeting,
6481
MemberHouseMeetingAttendance.meeting_id == HouseMeeting.id
@@ -93,8 +110,10 @@ def display_spring_evals(internal=False, user_dict=None):
93110

94111
cm_attended_count = cm_count.get(uid, 0)
95112
ts_attended_count = ts_count.get(uid, 0)
113+
ts_hosted_count = ts_host_count.get(uid, 0)
96114

97-
passing = len(member_missed_hms) <= 1 and cm_attended_count >= 6 and ts_attended_count >= 2
115+
ts_passing = ts_attended_count >= 2 or ts_hosted_count >= 1
116+
passing = len(member_missed_hms) <= 1 and cm_attended_count >= 6 and ts_passing
98117

99118
status = 'disenfranchised'
100119

@@ -107,8 +126,10 @@ def display_spring_evals(internal=False, user_dict=None):
107126
'status': status,
108127
'committee_meetings': cm_attended_count,
109128
'technical_seminars': ts_attended_count,
129+
'technical_seminars_hosted': ts_hosted_count,
110130
'req_meetings': 6,
111131
'req_seminars': 2,
132+
'req_seminars_hosted': 1,
112133
'house_meetings_missed': member_missed_hms,
113134
}
114135

@@ -128,4 +149,5 @@ def display_spring_evals(internal=False, user_dict=None):
128149
members=gk_members,
129150
gatekeep_active=gatekeep_active,
130151
req_meetings=6,
131-
req_seminars=2)
152+
req_seminars=2,
153+
req_seminars_hosted=1)

conditional/blueprints/intro_evals.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@
99
from conditional.models.models import FreshmanEvalData
1010
from conditional.models.models import FreshmanHouseMeetingAttendance
1111
from conditional.models.models import FreshmanSeminarAttendance
12+
from conditional.models.models import FreshmanSeminarHost
1213
from conditional.models.models import HouseMeeting
1314
from conditional.models.models import MemberCommitteeAttendance
1415
from conditional.models.models import MemberHouseMeetingAttendance
1516
from conditional.models.models import MemberSeminarAttendance
17+
from conditional.models.models import MemberSeminarHost
1618
from conditional.models.models import TechnicalSeminar
1719
from conditional.util.auth import get_user
1820
from conditional.util.flask import render_template
@@ -70,14 +72,36 @@ def get_intro_members_without_accounts():
7072
TechnicalSeminar.name
7173
).all()
7274

75+
freshman_ts_host_query = FreshmanSeminarHost.query.join(
76+
TechnicalSeminar,
77+
FreshmanSeminarHost.seminar_id == TechnicalSeminar.id
78+
).with_entities(
79+
FreshmanSeminarHost.fid,
80+
TechnicalSeminar.timestamp,
81+
TechnicalSeminar.approved
82+
).filter(
83+
TechnicalSeminar.approved,
84+
TechnicalSeminar.timestamp >= semester_start
85+
).with_entities(
86+
FreshmanSeminarHost.fid,
87+
TechnicalSeminar.name
88+
).all()
89+
7390
freshman_ts_attendance_dict = {}
91+
freshman_ts_host_dict = {}
7492

7593
for row in freshman_ts_attendance_query:
7694
if not row[0] in freshman_ts_attendance_dict:
7795
freshman_ts_attendance_dict[row[0]] = []
7896

7997
freshman_ts_attendance_dict[row[0]].append(row[1])
8098

99+
for row in freshman_ts_host_query:
100+
if not row[0] in freshman_ts_host_dict:
101+
freshman_ts_host_dict[row[0]] = []
102+
103+
freshman_ts_host_dict[row[0]].append(row[1])
104+
81105
# freshmen who don't have accounts
82106
freshman_accounts = list(FreshmanAccount.query.filter(
83107
FreshmanAccount.eval_date >= semester_start))
@@ -114,6 +138,7 @@ def get_intro_members_without_accounts():
114138
'committee_meetings_passed': cms_attended >= 6,
115139
'house_meetings_missed': missed_hms,
116140
'technical_seminars': freshman_ts_attendance_dict.get(freshman_account.id, []),
141+
'technical_seminars_hosted': freshman_ts_host_dict.get(freshman_account.id, []),
117142
'social_events': '',
118143
'comments': "",
119144
'ldap_account': False,
@@ -183,14 +208,36 @@ def display_intro_evals(internal=False, user_dict=None):
183208
TechnicalSeminar.name
184209
).all()
185210

211+
account_ts_hosted_query = MemberSeminarHost.query.join(
212+
TechnicalSeminar,
213+
MemberSeminarHost.seminar_id == TechnicalSeminar.id
214+
).with_entities(
215+
MemberSeminarHost.uid,
216+
TechnicalSeminar.timestamp,
217+
TechnicalSeminar.approved
218+
).filter(
219+
TechnicalSeminar.approved,
220+
TechnicalSeminar.timestamp >= semester_start
221+
).with_entities(
222+
MemberSeminarHost.uid,
223+
TechnicalSeminar.name
224+
).all()
225+
186226
account_ts_attendance_dict = {}
227+
account_ts_hosted_dict = {}
187228

188229
for row in account_ts_attendance_query:
189230
if not row[0] in account_ts_attendance_dict:
190231
account_ts_attendance_dict[row[0]] = []
191232

192233
account_ts_attendance_dict[row[0]].append(row[1])
193234

235+
for row in account_ts_hosted_query:
236+
if not row[0] in account_ts_hosted_dict:
237+
account_ts_hosted_dict[row[0]] = []
238+
239+
account_ts_hosted_dict[row[0]].append(row[1])
240+
194241
# freshmen who have accounts
195242
for member in members:
196243
uid = member.uid
@@ -229,6 +276,7 @@ def display_intro_evals(internal=False, user_dict=None):
229276
'committee_meetings_passed': cms_attended >= 6,
230277
'house_meetings_missed': member_missed_hms,
231278
'technical_seminars': account_ts_attendance_dict.get(uid, []),
279+
'technical_seminars_hosted': account_ts_hosted_dict.get(uid, []),
232280
'social_events': freshman_data.social_events,
233281
'comments': freshman_data.other_notes,
234282
'ldap_account': True,

0 commit comments

Comments
 (0)