Skip to content

Commit 50d1ac5

Browse files
authored
Merge branch 'development' into add-approve-button-in-labor-history-form
2 parents 00b69f4 + a74aca5 commit 50d1ac5

File tree

5 files changed

+429
-201
lines changed

5 files changed

+429
-201
lines changed

app/controllers/main_routes/main_routes.py

Lines changed: 24 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
1-
from flask import render_template, request, json, redirect, url_for, send_file, g, flash
2-
from peewee import fn
1+
from flask import render_template, request, json, redirect, url_for, send_file, g, flash, jsonify
2+
from peewee import JOIN
3+
from functools import reduce
4+
import operator
35
from app.models.department import Department
46
from app.models.supervisor import Supervisor
57
from app.models.supervisorDepartment import SupervisorDepartment
68
from app.models.student import Student
79
from app.models.laborStatusForm import LaborStatusForm
810
from app.models.formHistory import FormHistory
11+
from app.models.term import Term
912
from app.controllers.admin_routes.allPendingForms import checkAdjustment
1013
from app.controllers.main_routes import main_bp
1114
from app.logic.download import CSVMaker, saveFormSearchResult, retrieveFormSearchResult
12-
from app.logic.search import getDepartmentsForSupervisor
15+
from app.logic.search import getDepartmentsForSupervisor, searchPerson, searchSupervisorPortal
1316
from app.login_manager import require_login, logout
1417
from app.logic.getTableData import getDatatableData
1518
from app.logic.banner import Banner
@@ -31,47 +34,16 @@ def supervisorPortal():
3134

3235
return render_template('errors/403.html'), 403
3336

34-
terms = LaborStatusForm.select(LaborStatusForm.termCode).distinct().order_by(LaborStatusForm.termCode.desc())
35-
allSupervisors = Supervisor.select()
36-
supervisorFirstName = fn.COALESCE(Supervisor.preferred_name, Supervisor.legal_name)
37-
studentFirstName = fn.COALESCE(Student.preferred_name, Student.legal_name)
38-
department = None
37+
if request.method == 'POST':
38+
return getDatatableData(request)
39+
3940
if currentUser.isLaborAdmin or currentUser.isFinancialAidAdmin or currentUser.isSaasAdmin:
4041
departments = list(Department.select().order_by(Department.isActive.desc(), Department.DEPT_NAME.asc()))
41-
supervisors = (Supervisor.select(Supervisor, supervisorFirstName)
42-
.order_by(Supervisor.isActive.desc(), supervisorFirstName.contains("Unknown"), supervisorFirstName, Supervisor.LAST_NAME))
43-
students = (Student.select(Student, studentFirstName)
44-
.order_by(studentFirstName.contains("Unknown"), studentFirstName, Student.LAST_NAME))
45-
4642
else:
4743
departments = list(getDepartmentsForSupervisor(currentUser).order_by(Department.isActive.desc(), Department.DEPT_NAME.asc()))
48-
deptNames = [department.DEPT_NAME for department in departments]
49-
50-
supervisorPrimaryDepartment = Department.select().join(SupervisorDepartment) # count up all forms for a supervisor in department and get the max
51-
52-
supervisors = (Supervisor.select(Supervisor, supervisorFirstName)
53-
.join_from(Supervisor, LaborStatusForm)
54-
.join_from(LaborStatusForm, Department)
55-
.where(Department.DEPT_NAME.in_(deptNames))
56-
.distinct()
57-
.order_by(Supervisor.isActive.desc(), supervisorFirstName.contains("Unknown"), supervisorFirstName, Supervisor.LAST_NAME))
58-
59-
students = (Student.select(Student, studentFirstName)
60-
.join_from(Student, LaborStatusForm)
61-
.join_from(LaborStatusForm, Department)
62-
.where(Department.DEPT_NAME.in_(deptNames))
63-
.order_by(studentFirstName.contains("Unknown"), studentFirstName, Student.LAST_NAME)
64-
.distinct())
65-
if request.method == 'POST':
66-
return getDatatableData(request)
6744

6845
return render_template('main/supervisorPortal.html',
69-
terms = terms,
70-
supervisors = supervisors,
71-
allSupervisors = allSupervisors,
72-
students = students,
7346
departments = departments,
74-
department = department,
7547
currentUser = currentUser
7648
)
7749

@@ -112,7 +84,21 @@ def downloadSupervisorPortalResults():
11284
)
11385
return send_file(excel.relativePath, as_attachment=True, attachment_filename=excel.relativePath.split('/').pop())
11486

115-
@main_bp.route('/lsf/<formHistoryId>/submitToBanner', methods=['GET'])
87+
@main_bp.route('/supervisorPortal/liveSearch', methods=['GET'])
88+
def SupervisorPortalSearch():
89+
"""
90+
Returns a list of users that match a given string
91+
"""
92+
searchType = request.args.get("searchType")
93+
userInput = request.args.get("userInput")
94+
95+
if not searchType or not userInput:
96+
return jsonify({}), 400
97+
currentUser = require_login()
98+
userList = searchSupervisorPortal(currentUser, searchType, userInput)
99+
return jsonify(userList)
100+
101+
@main_bp.route('/lsf/<formHistoryId>/submitToBanner', methods=['GET'])
116102
def submitToBanner(formHistoryId):
117103
if not (g.currentUser.isLaborAdmin or g.currentUser.isLaborDepartmentStudent):
118104
return render_template('errors/403.html'), 403

app/logic/getTableData.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import operator
2-
from datetime import datetime, date
2+
from datetime import date
33
from functools import reduce
44

55
from flask import json, jsonify, g, make_response
6-
from peewee import fn, Case
6+
from peewee import fn, SQL
77

88
from app.controllers.admin_routes.allPendingForms import checkAdjustment
99
from app.logic.search import getDepartmentsForSupervisor
@@ -40,7 +40,7 @@ def getDatatableData(request):
4040
if termCode == "currentTerm":
4141
termCode = g.openTerm
4242
elif termCode == "activeTerms":
43-
termCode = list(Term.select(Term.termCode).where(Term.termEnd >= datetime.now()))
43+
termCode = list(Term.select(Term.termCode).where(Term.termEnd >= date.today()))
4444
departmentId = queryFilterDict.get('departmentID', "")
4545
supervisorId = queryFilterDict.get('supervisorID', "")
4646
if supervisorId == "currentUser":
@@ -82,10 +82,9 @@ def getDatatableData(request):
8282
if clauses:
8383
formSearchResults = formSearchResults.where(reduce(operator.and_, clauses))
8484
if not g.currentUser.isLaborAdmin:
85-
supervisorDepartments = [d.departmentID for d in getDepartmentsForSupervisor(g.currentUser)]
85+
supervisorDepartments = getDepartmentsForSupervisor(g.currentUser)
8686
formSearchResults = formSearchResults.where(FormHistory.formID.department.in_(supervisorDepartments))
87-
recordsTotal = len(formSearchResults)
88-
87+
recordsTotal = formSearchResults.count()
8988
# this checks and finds the first value that is not null of preferred_name, legal_name and last_name.
9089
# including last_name is necessary because there are like 4 cases where someone has no first name or last name, instead their full name is
9190
# stored in last_name

app/logic/search.py

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
from app.models.laborStatusForm import LaborStatusForm
55
from app.models.department import Department
66
from app.models.formHistory import FormHistory
7+
from app.models.term import Term
8+
9+
from functools import reduce
10+
import operator
11+
from peewee import JOIN
712

813
def limitSearchByUserDepartment(students, currentUser):
914
"""
@@ -62,4 +67,71 @@ def getDepartmentsForSupervisor(currentUser):
6267

6368
def getSupervisorsForDepartment(departmentId):
6469
departmentSupervisors = Supervisor.select().join(SupervisorDepartment).where(SupervisorDepartment.department == departmentId).order_by(Supervisor.LAST_NAME).execute()
65-
return departmentSupervisors
70+
return departmentSupervisors
71+
72+
def searchSupervisorPortal(currentUser, searchType, userInput):
73+
if currentUser.isLaborAdmin or currentUser.isFinancialAidAdmin or currentUser.isSaasAdmin:
74+
allowed_departments = None # unrestricted
75+
else:
76+
allowed_departments = [dept.DEPT_NAME for dept in getDepartmentsForSupervisor(currentUser)]
77+
78+
if searchType == "termSelect":
79+
terms = Term.select().where(Term.termName.contains(userInput)).order_by(Term.termCode.desc())
80+
return [{'termCode': term.termCode, 'termName': term.termName} for term in terms]
81+
82+
elif searchType == "departmentSelect":
83+
query = Department.select().where(Department.DEPT_NAME.contains(userInput))
84+
if allowed_departments is not None:
85+
query = query.where(Department.DEPT_NAME.in_(allowed_departments))
86+
query = query.order_by(Department.isActive.desc(), Department.DEPT_NAME.asc()).limit(10)
87+
return [
88+
{'DEPT_NAME': dept.DEPT_NAME, 'id': dept.departmentID, 'isActive': dept.isActive}
89+
for dept in query
90+
]
91+
92+
elif searchType == "supervisorSelect":
93+
supervisor_query = searchPerson(Supervisor, userInput, allowed_departments)
94+
supervisor_query = supervisor_query.order_by(Supervisor.isActive.desc()).limit(10)
95+
return [
96+
{'id': sup.ID, 'FIRST_NAME': sup.FIRST_NAME, "LAST_NAME": sup.LAST_NAME, "isActive": sup.isActive}
97+
for sup in supervisor_query
98+
]
99+
100+
elif searchType == "studentSelect":
101+
student_query = searchPerson(Student, userInput, allowed_departments)
102+
student_query = student_query.order_by(Student.LAST_NAME.asc()).limit(10)
103+
return [
104+
{'id': stu.ID, 'FIRST_NAME': stu.FIRST_NAME, 'LAST_NAME': stu.LAST_NAME}
105+
for stu in student_query
106+
]
107+
108+
return []
109+
110+
def searchPerson(model, userInput, allowed_departments=None):
111+
"""
112+
Returns a Peewee SelectObject filtered so that all words in userInput
113+
must appear in at least one of the model's fields.
114+
"""
115+
words = userInput.strip().split()
116+
117+
word_conditions = []
118+
for word in words:
119+
word_conditions.append(
120+
(model.preferred_name.contains(word)) |
121+
(model.legal_name.contains(word)) |
122+
(model.LAST_NAME.contains(word)) |
123+
(model.ID.contains(word))
124+
)
125+
126+
query = model.select().where(reduce(operator.and_, word_conditions))
127+
128+
if allowed_departments is not None:
129+
query = (
130+
query
131+
.join_from(model, LaborStatusForm, JOIN.LEFT_OUTER)
132+
.join_from(LaborStatusForm, Department, JOIN.LEFT_OUTER)
133+
.where(Department.DEPT_NAME.in_(allowed_departments))
134+
.distinct()
135+
)
136+
137+
return query

0 commit comments

Comments
 (0)