Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
142 commits
Select commit Hold shift + click to select a range
9bd90f6
added changes from previous branch to avoid all files being commited
conwelld Jul 21, 2026
56d5a29
fixed some pr comments
conwelld Jul 21, 2026
faf1957
fixed some pr comments for css styling
conwelld Jul 21, 2026
1204269
fixed useless code
conwelld Jul 21, 2026
0f166c2
fixed department code
conwelld Jul 21, 2026
6f5850a
We have change the hard coded part with variable able to be flexible …
Jul 22, 2026
813f398
Temporary allocation logic will be replaced by the official shared se…
Jul 22, 2026
7584ffa
fix the review comment from Minran, all of them
DanielRukwasha Jul 27, 2026
e9a4415
Merge branch 'department-portal-base' into new-allocation-card, resol…
DanielRukwasha Jul 28, 2026
5cfa98c
added revisedBy to positionHistory.py and created demo data for it
johnlolonga19 Jul 28, 2026
fb4924f
added the routes for the individual position page and created the htm…
johnlolonga19 Jul 28, 2026
bc35aa4
added the download position description button
johnlolonga19 Jul 28, 2026
64c729b
resizig html texts
johnlolonga19 Jul 29, 2026
30030a2
Fixed alignment issue with buttons caused by bootstrap version descre…
ACBerea Jul 29, 2026
20b424c
Fix import after allocationUtilization rename to getAllocation, add i…
DanielRukwasha Jul 29, 2026
cdc18b6
Improved css namaing structure and began working on improved demo data.
ACBerea Jul 29, 2026
d8b4ece
made minor to changes to css, html, and demo_data files
johnlolonga19 Jul 29, 2026
f700635
Merge branch 'department-portal-base' of https://github.com/BCStudent…
johnlolonga19 Jul 29, 2026
e4fd883
changes around the position descrription for format
johnlolonga19 Jul 29, 2026
722606b
Adjusted HTML in individualPositions.html for consistent formatting.
ACBerea Jul 30, 2026
ee0e066
Address PR review comments: consolidate getAllocation return dict, ex…
DanielRukwasha Jul 30, 2026
6abd704
Merge branch 'department-portal-base' into new-allocation-card, resol…
DanielRukwasha Jul 30, 2026
0eb3bb1
Added necessary files for the allocationTable
fritzj2 Jul 30, 2026
36e6d95
Fixed some demo data to accuratly reflect sudo-real data.
ACBerea Jul 30, 2026
c0698e5
Fixed margin issue in individualPosition.html, replaced outdated jinj…
ACBerea Jul 30, 2026
8618b68
Adopt approval-status filtering from UsedAllocFunction branch in getA…
DanielRukwasha Jul 30, 2026
79c21f9
added functionality to the download button, by updating routing and a…
johnlolonga19 Jul 30, 2026
5ab2dca
added the individual term for each row in the table
fritzj2 Jul 30, 2026
ff37958
Renamed individualPosition to positionDescription and moved positionD…
ACBerea Jul 30, 2026
ce23c09
Bootstrap datatable was implemented
fritzj2 Jul 30, 2026
21e6670
Implemented a new function in getPositions to get a single position a…
ACBerea Jul 30, 2026
05216d0
added a download button to the page
fritzj2 Jul 30, 2026
85e2321
Added a clarifying comment to positionHistory.py and added a test for…
ACBerea Jul 30, 2026
9268ad0
Reverted getPositionRevision function to getPosition and updated all …
ACBerea Jul 30, 2026
5c830c1
Added download.py test file missed in previous commit.
ACBerea Jul 30, 2026
bb55ca8
move the downoad button to the top right, and fixed pdf formatting
johnlolonga19 Jul 31, 2026
c8f12b1
Added accordians instead of a giant table
fritzj2 Jul 31, 2026
2f9bcda
added position description model
johnlolonga19 Jul 31, 2026
78e1152
added the sections logic and demo data
johnlolonga19 Jul 31, 2026
beaba49
structured primaries table
fritzj2 Jul 31, 2026
e981118
Formatted the break table
fritzj2 Jul 31, 2026
fd7c2c6
removed an unecessary card from the HTML
fritzj2 Aug 3, 2026
5c35d1d
Finished a test suite for the makePositionDescriptionPDF() to ensure …
ACBerea Aug 3, 2026
0c9fbb5
Resolved merge conflicts and made minor adjustments to existing code …
ACBerea Aug 3, 2026
a0ba238
Polish the allocation card: dynamic Fall/Spring term label, "X of Y" …
munsakad Aug 3, 2026
ddad2d2
added logic using the allocationManager
fritzj2 Aug 3, 2026
86bee45
Merge branch 'department-portal-base' into new-allocation-card
munsakad Aug 3, 2026
45b13e0
Fix duplicate main.managePositions endpoint left over from the depart…
munsakad Aug 3, 2026
74bdd3a
Rework allocation rows to the "N hr: X contracts (out of Y allocation…
munsakad Aug 3, 2026
eb4e0af
Added break contracts to the table
fritzj2 Aug 3, 2026
e9a48ed
Fixed issues regarding a sidebar appearing on the x-axis of the page …
ACBerea Aug 3, 2026
9eaf061
fixed function calls, added more data for breaks
fritzj2 Aug 3, 2026
a7ca474
Address allocation card review: camelCase naming, stacked layout, con…
munsakad Aug 4, 2026
fa1114d
Fixed issue with sidebar creating additional x-axis scroll bar and ma…
ACBerea Aug 4, 2026
64f4dc4
got the contracts to count in page
fritzj2 Aug 4, 2026
c3e9cc1
Request allocation modification button
fritzj2 Aug 4, 2026
5350883
Created the secondaries table
fritzj2 Aug 4, 2026
f9670d3
table now calls allocations
fritzj2 Aug 4, 2026
23e84d1
fixed table sizing
fritzj2 Aug 4, 2026
4b746f0
Fully fixed the .sidebar-push issue for all pages, reformatted demo_d…
ACBerea Aug 4, 2026
54a3f13
added arrows to the accordions in th tables
fritzj2 Aug 4, 2026
cc374dc
fixed formatting of html
fritzj2 Aug 4, 2026
827f390
changed allocation req wording
fritzj2 Aug 4, 2026
5978774
fixed the contract index, the total returns correctly now
fritzj2 Aug 4, 2026
32f8f6b
fixed the sum of break hours
fritzj2 Aug 4, 2026
5110359
added the fall break row
fritzj2 Aug 4, 2026
87d4604
Fixed spacing issues in download function. Fixed UI issues in both de…
ACBerea Aug 4, 2026
071232b
moved the header to be centered
fritzj2 Aug 4, 2026
0760c5d
Merge branch 'department-portal-base' into allocation_table
fritzj2 Aug 4, 2026
fa4a35c
fixed format of accordions
fritzj2 Aug 4, 2026
89528fb
Merge branch 'department-portal-base' into individual_pos_page_JA
MImran2002 Aug 4, 2026
d3be123
Merge pull request #660 from BCStudentSoftwareDevTeam/individual_pos_…
MImran2002 Aug 4, 2026
5f44de5
Merge branch 'department-portal-base' of https://github.com/BCStudent…
fritzj2 Aug 5, 2026
764db13
fixed the button layout
fritzj2 Aug 5, 2026
c7ef1ec
Merge branch 'department-portal-base' of https://github.com/BCStudent…
munsakad Aug 5, 2026
25d9a9b
Reuse allocationManager.py in getAllocation.py
munsakad Aug 5, 2026
f5640b3
Fix missing LaborReleaseForm import in demo_data.py
munsakad Aug 5, 2026
4c17019
Fix allocation card showing zeros for departments with only a draft a…
munsakad Aug 5, 2026
b67164b
Added tests for getBreakContracts
fritzj2 Aug 5, 2026
cdfbae5
made getStudents() less brittle
fritzj2 Aug 5, 2026
2736b90
added notes to getBreakContracts test
fritzj2 Aug 5, 2026
22a1856
added a test for changing terms
fritzj2 Aug 5, 2026
f3b43c6
removed unneccesary comments
munsakad Aug 5, 2026
6ae3931
removed department information in main routes
munsakad Aug 5, 2026
2005c87
created date check in allocationManager
fritzj2 Aug 5, 2026
b9f9cc4
fixed comments for date logic
fritzj2 Aug 6, 2026
96ffe5f
fixed current term logic
fritzj2 Aug 6, 2026
ea29109
shortened js significantly.
fritzj2 Aug 6, 2026
73af911
added a check if no break contracts are found
fritzj2 Aug 6, 2026
76a167b
checks if the user is in a department
fritzj2 Aug 6, 2026
f74fb7d
test_allocationManager accurately reflects changes to logic
fritzj2 Aug 6, 2026
c884811
Added 2026 allocation data and new 202600 term
zhytkovd Aug 6, 2026
0b0861c
added data for the Requested Allocations for the AY26-27
zhytkovd Aug 6, 2026
6c9835d
Polished demodata for the allocations
zhytkovd Aug 7, 2026
53a4f35
Changed backend logic by implementing a dictionary with the objects
zhytkovd Aug 7, 2026
e4b2bc0
fixed test_allocationManager.py name
fritzj2 Aug 7, 2026
8c417f7
contractHours != None -> .is_null(False)
fritzj2 Aug 7, 2026
6299820
removed AddUserToDept route again
fritzj2 Aug 7, 2026
4b2ece2
fixed allocationManager import functions
fritzj2 Aug 7, 2026
1e4d1d4
fixed termCode function calls
fritzj2 Aug 7, 2026
18f1abc
added 404 error to no dept allocation view
fritzj2 Aug 7, 2026
7b0cd5a
added more comments to date contContracts
fritzj2 Aug 7, 2026
2e75207
Finished surface testing of the functions
zhytkovd Aug 8, 2026
3fa1daf
Fixed minor datatable bug realted to jinja rendering
zhytkovd Aug 8, 2026
8ef2325
break table: spring -> spring break
fritzj2 Aug 19, 2026
a38dc46
test_GestSTudents now works correctly, still brittle
fritzj2 Aug 19, 2026
9c7b727
switched the position of total in the tables.
fritzj2 Aug 19, 2026
47f4f57
added case for no allocation being found
fritzj2 Aug 20, 2026
26be0a4
fixed order of table elements
fritzj2 Aug 20, 2026
b3ec72e
removed print statements from tests
fritzj2 Aug 20, 2026
d374990
fixed table resizing issue
fritzj2 Aug 21, 2026
4cc64c9
added tooltips to the Total Contracts Table
fritzj2 Aug 21, 2026
da32680
centered the text for the accordions
fritzj2 Aug 21, 2026
8d32fe2
added a tooltip for the break allocations
fritzj2 Aug 21, 2026
187a5b6
added a logic file to get all Current Terms
fritzj2 Aug 21, 2026
8747fda
removed unecessary import
fritzj2 Aug 21, 2026
dd2516f
began writing test getCurrentTerms.py
fritzj2 Aug 21, 2026
784f429
reworked getCurrentTerms to allow for all terms
fritzj2 Aug 24, 2026
11a152b
fixed logic month check for current year
fritzj2 Aug 24, 2026
fe8edc5
fixed spring/fall check when given an AY
fritzj2 Aug 24, 2026
4357e62
refactored function names: getCurrentTerms() -> getTerms()
fritzj2 Aug 24, 2026
f0ab813
Merge pull request #667 from BCStudentSoftwareDevTeam/allocation_table
MImran2002 Aug 25, 2026
6f9486f
Merge branch 'department-portal-base' of https://github.com/BCStudent…
fritzj2 Aug 27, 2026
6d6997c
removed merge conflict fragment
fritzj2 Aug 27, 2026
ded0a5e
fixed broken icons in css
fritzj2 Aug 27, 2026
ba90482
added smaller logic for the allocation card
fritzj2 Aug 28, 2026
300b7b0
HTML now uses new variables
fritzj2 Aug 28, 2026
10fdda4
added the current semester
fritzj2 Aug 28, 2026
02a100d
fixed syntax when no value it given
fritzj2 Aug 28, 2026
9bb3197
removed out of scope change
fritzj2 Aug 28, 2026
fd86d2a
removed out of scope database issue
fritzj2 Aug 28, 2026
0b0324a
removed unused dateTime import
fritzj2 Aug 28, 2026
db6f90a
removed unused logic file
fritzj2 Aug 28, 2026
c64353e
fixed screen resizing with the allocation card
fritzj2 Aug 31, 2026
e42fd24
removed BI info circle from css and js as it is unused
fritzj2 Aug 31, 2026
a675ef8
cleaned up css styling
fritzj2 Aug 31, 2026
e775b40
reoved unused if statement for term check
fritzj2 Aug 31, 2026
ac9beda
readded cd database into reset_database
fritzj2 Sep 1, 2026
08ec7a5
Merge pull request #654 from BCStudentSoftwareDevTeam/new-allocation-…
MImran2002 Sep 1, 2026
bf7fa1e
remove extra line of code that is not used.
MImran2002 Sep 14, 2026
9c36440
Merge branch 'department-portal-base' of https://github.com/BCStudent…
MImran2002 Sep 14, 2026
347256d
Revert "Merge branch 'department-portal-base' of https://github.com/B…
MImran2002 Sep 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 8 additions & 28 deletions app/controllers/admin_routes/manageDepartments.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,12 @@

from app.logic.manageDepartments import *



@admin.route('/admin/manageDepartments/', methods=['GET'])
def manageDepartments(academicYear = None):
"""
Returns the Manage Departments page, which allows the admin to view all the departments
and their allocations.
"""

# Checking Admin Rights
currentUser = require_login()
if not currentUser: # If the current user is not logged in
Expand All @@ -36,42 +33,25 @@ def manageDepartments(academicYear = None):
elif currentUser.supervisor:
return render_template('errors/403.html'), 403


# The condition below may be deleted if the routing to the Manage Departments page is changed.
if academicYear == None:
academicYear = g.openTerm.termCode
else:
academicYear = int(academicYear)


currentAY, nextAY = generateAdjacentYears(academicYear)
chosenAY = Term.get(Term.termCode == academicYear)

breakHoursByDepartment = {row["department"]: str(row["totalHours"] or 0) for row in getUsedBreakHours(chosenAY)}

activeDepartments = getActiveDepartmentsWithAllocation(chosenAY)
inactiveDepartments = Department.select().where(Department.isActive == False)
currentAY, nextAY = generateAdjacentYears(g.openTerm.termCode)

allocationStatus = {
department.departmentID: getAllocationStatus(chosenAY, department)
for department in activeDepartments
}
inactiveDepartments = Department.select().where(Department.isActive == False)
allSupervisors = Supervisor.select().order_by(Supervisor.LAST_NAME)

breakHoursByDepartment = {row["department"]: str(row["totalHours"] or 0) for row in getUsedBreakHours(currentAY)}

allSupervisors= Supervisor.select().order_by(Supervisor.LAST_NAME)
activeDepartmentsAllocations = getActiveDepartmentsAllocations(currentAY,nextAY)

return render_template( 'admin/manageDepartments.html',
activeDepartments = activeDepartments,
activeDepartmentsAllocations = activeDepartmentsAllocations,
inactiveDepartments = inactiveDepartments,
allSupervisors = allSupervisors,
allSupervisors = allSupervisors,
currentAY = currentAY,
nextAY = nextAY,
academicYear = chosenAY.termName,
breakHoursByDepartment = breakHoursByDepartment,
allocationStatus = allocationStatus
)



@admin.route('/admin/complianceStatus', methods=['POST'])
def complianceStatusCheck():
"""
Expand Down
67 changes: 49 additions & 18 deletions app/logic/manageDepartments.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,13 @@
from app.login_manager import require_login



def generateAdjacentYears(academicYearTermCode=None):
"""
Generates the current, the previous, and the following academic years.
Generates the current, and the following academic years.
"""

currentYear = g.openTerm.termCode // 100
nextYear = currentYear + 1


currentAYCode = currentYear * 100
nextAYCode = nextYear * 100

Expand Down Expand Up @@ -50,9 +47,6 @@ def generateAdjacentYears(academicYearTermCode=None):
# Everything below this line will eventually be deleted





def getUsedBreakHours(term):
"""
Returns the total number of break hours used by each department for a given term.
Expand Down Expand Up @@ -109,7 +103,7 @@ def getLSFCountSecondaries(currentTerm, department):



def getActiveDepartmentsWithAllocation(term):
def getActiveDepartmentsWithAllocation(term,isFinal = True):
"""
Returns a list of active departments with allocations for the given term.
"""
Expand All @@ -118,24 +112,61 @@ def getActiveDepartmentsWithAllocation(term):
# activeDepartments = Department.select().where(Department.isActive == True)
# allAllocations = Allocation.select().where(Allocation.termCode == currentAY)

activeDepartments = (Department
activeDepartments = (Allocation
.select(Department, Allocation)
.join(Allocation)
.join(Department)
.where(
Department.isActive == True,
Allocation.termCode == term.termCode
)
Allocation.termCode == term.termCode,
Allocation.isFinal == isFinal,
)
)

for dept in activeDepartments:
dept.totalPrimaries = (dept.allocation.primary_10 + dept.allocation.primary_12 + dept.allocation.primary_15 + dept.allocation.primary_20)
dept.totalSecondaries = (dept.allocation.secondary_5 + dept.allocation.secondary_10)

for allocation in activeDepartments:
allocation.totalPrimaries = (allocation.primary_10 + allocation.primary_12 + allocation.primary_15 + allocation.primary_20)
allocation.totalSecondaries = (allocation.secondary_5 + allocation.secondary_10)

if isFinal: # do not need to count them for requested allocations
allocation.lsfCountPrimaries = getLSFCountPrimaries(term, allocation.department)
allocation.lsfCountSecondaries = getLSFCountSecondaries(term, allocation.department)

return activeDepartments

dept.lsfCountPrimaries = getLSFCountPrimaries(term, dept)
dept.lsfCountSecondaries = getLSFCountSecondaries(term, dept)

return activeDepartments
def getActiveDepartmentsAllocations(term,nextTerm):
"""
This function gets active departments, active allocations for the current AY and future AY.
It returns a dictionary which contains three objects grouped by the departmentID
"""

activeDepartments = Department.select().where(Department.isActive == True)

allocations = getActiveDepartmentsWithAllocation(term)

allocByDeptId = {}

# index allocations by department ID
for alloc in allocations:
allocByDeptId[alloc.department.departmentID] = alloc

requestedAllocations = getActiveDepartmentsWithAllocation(nextTerm, False)

# index requested allocations by department ID
reqAllocByDeptId = {}
for alloc in requestedAllocations:
reqAllocByDeptId[alloc.department.departmentID] = alloc

# build combined dictionary for active departments
activeDepartmentsAllocations = {}

for dept in activeDepartments:
activeDepartmentsAllocations[dept.departmentID] = {
"department": dept,
"allocation": allocByDeptId.get(dept.departmentID), # None if no allocation
"requestedAllocation": reqAllocByDeptId.get(dept.departmentID), # None if no requested allocation
}
return activeDepartmentsAllocations


def getAllocationStatus(term, department):
Expand Down
71 changes: 44 additions & 27 deletions app/templates/admin/manageDepartments.html
Original file line number Diff line number Diff line change
Expand Up @@ -91,69 +91,79 @@ <h1>Manage Departments</h1>
<thead>
<tr>
<th>Department</th>

<th>Status</th>
<th>Current Allocations <br>({{ academicYear }})</th>
<th>Current Allocations <br>({{ currentAY.termName }})</th>
<th>Requested Allocations <br>({{ nextAY.termName }})</th>
<th class="noSorting">Actions</th>
</tr>
</thead>
<tbody>
{% for department in activeDepartments %}
{% for entry in activeDepartmentsAllocations.values() %}

<tr>
<td scope="row">
<a href="/department/{{ department.ORG }}/{{ department.ACCOUNT }}" class="departmentName"
id="{{department.departmentID}}">{{department.DEPT_NAME}}</a><br><small>({{department.ORG}},
{{department.ACCOUNT}})</small>
<a href="/department/{{ entry.department.ORG }}/{{ entry.department.ACCOUNT }}" class="departmentName"
id="{{entry.department.departmentID}}">{{entry.department.DEPT_NAME}}</a><br><small>({{entry.department.ORG}},
{{entry.department.ACCOUNT}})</small>
</td>
<td id="dept_{{department.departmentID}}" scope="row" style="text-align: center; vertical-align: middle"
data-order="{% if department.departmentCompliance == True %}1{% else %}-1{% endif %}">
<button type="button" id="dept_btn_{{department.departmentID}}" name="deptName"
class="{% if department.departmentCompliance == True %} btn btn-success {% else %} btn btn-danger {% endif %} complianceBtn"
onclick="status({{department.departmentID}}, '{{department.DEPT_NAME}}')"
value="{{department.departmentID}}">
{% if department.departmentCompliance == True %}In

<td id="dept_{{entry.department.departmentID}}" scope="row"
style="text-align: center; vertical-align: middle"
data-order="{% if entry.department.departmentCompliance == True %}1{% else %}-1{% endif %}">
<button type="button" id="dept_btn_{{entry.department.departmentID}}" name="deptName"
class="{% if entry.department.departmentCompliance == True %} btn btn-success {% else %} btn btn-danger {% endif %} complianceBtn"
onclick="status({{entry.department.departmentID}}, '{{entry.department.DEPT_NAME}}')"
value="{{entry.department.departmentID}}">
{% if entry.department.departmentCompliance == True %}In
Compliance{% else %}Not in Compliance{% endif %}
</button>
</td>

<td style="white-space: nowrap">
{% if entry.allocation %}
<span>
<strong>Primary: </strong>
{{department.lsfCountPrimaries}} of {{department.totalPrimaries}}
{{entry.allocation.lsfCountPrimaries}} of {{entry.allocation.totalPrimaries}}
</span>
<br>

<span>
<strong>Secondary:</strong>
{{department.lsfCountSecondaries}} of {{department.totalSecondaries}}
{{entry.allocation.lsfCountSecondaries}} of {{entry.allocation.totalSecondaries}}
</span>
<br>
<span>
<strong>Break:</strong> {{ breakHoursByDepartment.get(department.departmentID, 0) }} of {{
department.allocation.breakHours }} hours
<strong>Break:</strong> {{ breakHoursByDepartment.get(entry.department.departmentID, 0) }} of
{{entry.allocation.breakHours }} hours
</span>
{% else %}
<span class="text-muted">No current allocation</span>
{% endif %}

</td>


<td style="white-space: nowrap">
{% if entry.allocation %}
<span>
<strong>Primary: </strong>
{{department.lsfCountPrimaries}} of {{department.totalPrimaries}}
{{entry.requestedAllocation.totalPrimaries}}
</span>
<br>
<span>
<strong>Secondary:</strong>
{{department.lsfCountSecondaries}} of {{department.totalSecondaries}}
{{entry.requestedAllocation.totalSecondaries}}
</span>
<br>
<span>
<strong>Break:</strong> {{ breakHoursByDepartment.get(department.departmentID, 0) }} of {{ department.allocation.breakHours }} hours
<strong>Break:</strong> {{ entry.requestedAllocation.breakHours }} hours
</span>
{% else %}
<span class="text-muted">No current allocation</span>
{% endif %}

</td>



<td style="white-space: nowrap">
<div class="dropdown">
<button class="btn btn-primary dropdown-toggle" type="button" id="dropdownMenu1"
Expand All @@ -162,19 +172,26 @@ <h1>Manage Departments</h1>
<span class="caret"></span>
</button>
<ul class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenu1">
<li><a href="/department/{{department.ORG}}/{{department.ACCOUNT}}/allocations">Show Allocation
<li><a href="/department/{{entry.department.ORG}}/{{entry.department.ACCOUNT}}/allocations">Show
Allocation
History</a></li>
<li><a href="/department/{{department.ORG}}/{{department.ACCOUNT}}/members">Manage Dept Members</a>
<li><a href="/department/{{entry.department.ORG}}/{{entry.department.ACCOUNT}}/members">Manage Dept
Members</a>
</li>
<li><a href="/department/{{department.ORG}}/{{department.ACCOUNT}}/positions">View Positions</a>
<li><a href="/department/{{entry.department.ORG}}/{{entry.department.ACCOUNT}}/positions">View
Positions</a>
</li>
<li><a href="{{department.ORG}}/{{department.ACCOUNT}}/allocationReview">Review Allocation</a></li>
<li><a href="{{entry.department.ORG}}/{{entry.department.ACCOUNT}}/allocationReview">Review
Allocation</a></li>
</ul>


</div>
</div>

</td>
</tr>
{% endfor %}
{%endfor%}
</tbody>
</table>
</div>
Expand Down
Loading