diff --git a/app/config/default.yml b/app/config/default.yml index b480cc7d2..172d0afe0 100644 --- a/app/config/default.yml +++ b/app/config/default.yml @@ -7,6 +7,8 @@ support_email_contact: "support@bereacollege.onmicrosoft.com" show_queries: True test_entry: "Default" +lsf_url: "USE local-override.yml" + db: name: "celts" host: "db" diff --git a/app/controllers/minor/routes.py b/app/controllers/minor/routes.py index 64575ba4f..099ee6b64 100644 --- a/app/controllers/minor/routes.py +++ b/app/controllers/minor/routes.py @@ -29,6 +29,9 @@ def viewCceMinor(username): """ Load minor management page with community engagements and summer experience """ + if not (g.current_user.isAdmin or g.current_user.username == username or g.current_user.isCeltsStudentStaff): + return abort(403) + sustainedEngagementByTerm = getCommunityEngagementByTerm(username) activeTab = request.args.get("tab", "sustainedCommunityEngagements") diff --git a/app/logic/celtsLabor.py b/app/logic/celtsLabor.py index c32bc2eae..6b8766f59 100644 --- a/app/logic/celtsLabor.py +++ b/app/logic/celtsLabor.py @@ -97,13 +97,16 @@ def refreshCeltsLaborRecords(laborDict): for positionTitle, termNames in value.items(): for term in termNames: termTableMatch = Term.select() - if term[0].isalpha(): + isAcademicYear = False + + if term[0].isalpha(): # Fall, Spring, Summer termTableMatch = termTableMatch.where(Term.description == term) - else: + else: # e.g., 2025-2026 termTableMatch = termTableMatch.where(Term.academicYear == term, Term.description % "Fall%") + isAcademicYear = True + try: laborTerm = termTableMatch.get() - isAcademicYear = not laborTerm.isSummer celtsLabor.append({"user": key, "positionTitle": positionTitle, "term": laborTerm, @@ -117,14 +120,13 @@ def refreshCeltsLaborRecords(laborDict): def getCeltsLaborHistory(volunteer): laborHistoryList = list(CeltsLabor.select(CeltsLabor.positionTitle, + CeltsLabor.id, + CeltsLabor.isAcademicYear, Term.description, Term.academicYear, Term.isSummer) .join(Term, on=(CeltsLabor.term == Term.id)) - .where(CeltsLabor.user == volunteer)) - - laborHistoryDict= {} - for position in laborHistoryList: - laborHistoryDict[position.positionTitle] = position.term.description if position.term.isSummer else position.term.academicYear + .where(CeltsLabor.user == volunteer) + .order_by(Term.termOrder.asc())) - return laborHistoryDict + return [(p.positionTitle, f"AY {p.term.academicYear}" if p.isAcademicYear else p.term.description) for p in laborHistoryList] diff --git a/app/logic/searchUsers.py b/app/logic/searchUsers.py index 93a9046a3..d7511ee37 100644 --- a/app/logic/searchUsers.py +++ b/app/logic/searchUsers.py @@ -1,3 +1,4 @@ +from peewee import fn from playhouse.shortcuts import model_to_dict from app.models.user import User def searchUsers(query, category=None): @@ -6,15 +7,19 @@ def searchUsers(query, category=None): MySQL LIKE is case insensitive ''' - # add wildcards to each piece of the query splitSearch = query.strip().split() - firstName = splitSearch[0] + "%" - lastName = " ".join(splitSearch[1:]) +"%" - - if len(splitSearch) == 1: # search for query in first OR last name - searchWhere = (User.firstName ** firstName | User.lastName ** firstName | User.username ** splitSearch) - else: # search for first AND last name - searchWhere = (User.firstName ** firstName & User.lastName ** lastName) + if not splitSearch: + return User.select().where(False) + searchWhere = None + for namePart in splitSearch: + nameSearch = namePart + "%" + # This individual search term can match the user's first name, last name, or username. + namePartWhere = (User.firstName.contains(namePart) | User.lastName.contains(namePart) | User.username.contains(namePart)) + # For the first search term, initialize the WHERE condition. + if searchWhere is None: + searchWhere = namePartWhere + else: + searchWhere &= namePartWhere # Require every search term to match at least one of the first name, last name, or username fields. if category == "instructor": userWhere = (User.isFaculty | User.isStaff) @@ -33,7 +38,14 @@ def searchUsers(query, category=None): else: userWhere = (User.isStudent) + fullSearchText = " ".join(splitSearch) # Combine into query - searchResults = User.select().where(searchWhere, userWhere) + searchResults = User.select().where(searchWhere, userWhere).order_by( + fn.CONCAT(User.firstName, " ", User.lastName).contains(fullSearchText).desc(), + User.firstName.startswith(fullSearchText).desc(), + User.lastName.startswith(fullSearchText).desc(), + User.lastName, + User.firstName + ) return { user.username : model_to_dict(user) for user in searchResults } diff --git a/app/static/js/searchStudent.js b/app/static/js/searchStudent.js index bdfcc9e1f..3d6f8a087 100644 --- a/app/static/js/searchStudent.js +++ b/app/static/js/searchStudent.js @@ -1,7 +1,7 @@ import searchUser from './searchUser.js' function callback(selected) { - $("#searchStudentsInput").submit(); + $("#searchStudentsInput").closest("form").submit(); } $(document).ready(function() { diff --git a/app/templates/main/userProfile.html b/app/templates/main/userProfile.html index be2ecc605..2ab8523b1 100644 --- a/app/templates/main/userProfile.html +++ b/app/templates/main/userProfile.html @@ -294,8 +294,8 @@

{% if participatedInLabor %}
CELTS Labor History:
- {% for program, term in participatedInLabor.items() %} -

{{term}}: {{program}}

+ {% for positionTitle, term in participatedInLabor %} +

{{term}}: {{positionTitle}}

{% endfor %}
{% endif %} diff --git a/app/templates/sidebar.html b/app/templates/sidebar.html index bd3bbf031..60849ecf0 100644 --- a/app/templates/sidebar.html +++ b/app/templates/sidebar.html @@ -105,7 +105,7 @@

Current User: {{g.current_user.username}}
diff --git a/tests/code/test_celtsLabor.py b/tests/code/test_celtsLabor.py index 0beb24cfb..b8a33804a 100644 --- a/tests/code/test_celtsLabor.py +++ b/tests/code/test_celtsLabor.py @@ -241,16 +241,24 @@ def test_getCeltsLaborHistory(): CeltsLabor.create(user = mupotsal, positionTitle = "Habitat For Humanity Cord.", term = Term.get_by_id(2), - isAcademicYear = True) + isAcademicYear = False) - testDataAyisieHistory = {"Bonner Manager": "Summer 2021"} - getAyisieHistory = getCeltsLaborHistory(ayisie) + testDataAyisieHistory = [('Bonner Manager', 'Summer 2021')] - testDataMupotsalHistory = {"Habitat For Humanity Cord.": "2020-2021"} - getMupotsalHistory = getCeltsLaborHistory(mupotsal) + testDataMupotsalHistory = [('Habitat For Humanity Cord.', 'Spring 2021')] - assert getAyisieHistory == testDataAyisieHistory - assert getMupotsalHistory == testDataMupotsalHistory + assert testDataAyisieHistory == getCeltsLaborHistory(ayisie) + assert testDataMupotsalHistory == getCeltsLaborHistory(mupotsal) - transaction.rollback() \ No newline at end of file + CeltsLabor.create(user = mupotsal, + positionTitle = "Bonner Manager", + term = Term.get_by_id(1), + isAcademicYear = True) + + #this is to test if there are two different celts labor in a academic year it no longers show AY 2020-2021 instead shows Fall and Spring in ascending order + testDataMupotsalHistoryFallSpring = [('Bonner Manager', 'AY 2020-2021'), ('Habitat For Humanity Cord.', 'Spring 2021')] + + assert testDataMupotsalHistoryFallSpring == getCeltsLaborHistory(mupotsal) + + transaction.rollback() diff --git a/tests/code/test_search.py b/tests/code/test_search.py index 474633233..ec660fc3d 100644 --- a/tests/code/test_search.py +++ b/tests/code/test_search.py @@ -33,7 +33,7 @@ def test_searchUsers(): secondUser = User.create(username = 'sawconc', firstName = 'Candace', lastName = 'Sawcon', bnumber = '021556782', email = 'test@berea.edu', isStudent = True, cpoNumber = '1400') searchResults = searchUsers('sa') - assert len(searchResults) == 2 + assert len(searchResults) == 3 assert searchResults['lamichhanes2'] == model_to_dict(User.get_by_id('lamichhanes2')) assert searchResults["sawconc"] == model_to_dict (User.get_by_id('sawconc')) assert '(555)555-5555' in searchResults["lamichhanes2"].values()