Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
12 changes: 5 additions & 7 deletions app/models/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ class User(baseModel):
isStudent = BooleanField(default=False)
major = CharField(null=True)
rawClassLevel = CharField(null=True)
isActive = BooleanField(default=False)
isFaculty = BooleanField(default=False)
isStaff = BooleanField(default=False)
isCeltsAdmin = BooleanField(default=False)
Expand All @@ -35,17 +36,14 @@ def __init__(self,*args, **kwargs):

@property
def processedClassLevel(self):
if self.isAlumni:
if self.hasGraduated:
return "Alumni"

return self.rawClassLevel or "Not Enrolled"

@property
def isAlumni(self):
return self.hasGraduated or self.rawClassLevel == "Graduating"

@property
def isCurrentlyEnrolled(self):
return self.isStudent and not self.isAlumni
return self.isStudent and self.isActive

@property
def isAdmin(self):
Expand Down Expand Up @@ -116,4 +114,4 @@ def isProgramManager(self):

return self._isProgramManagerCache



44 changes: 30 additions & 14 deletions app/scripts/import_users.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import peewee

from app import app
from app.models import mainDB
from app.models.user import User
from app.logic.utils import getUsernameFromEmail

Expand Down Expand Up @@ -43,19 +44,33 @@ def main():
logger.debug("Script started.")
logger.debug("Don't forget to put the correct Tracy and LDAP passwords in app/config/local-override.yml")


logger.info("Getting Updated Names, Majors, and Class Levels")

studentData = addToDb(getStudentData())
studentAdded = studentData[0]
studentUpdated = studentData[1]
logger.info(f" {studentAdded} students were added.")
logger.info(f" {studentUpdated} students were updated.")

facultyStaffData = addToDb(getFacultyStaffData())
facultyStaffAdded = facultyStaffData[0]
facultyStaffUpdated = facultyStaffData[1]
logger.info(f" {facultyStaffAdded} faculties/staffs were added.")
logger.info(f" {facultyStaffUpdated} faculties/staffs were updated.")
with mainDB.atomic():
# mark students as graduated if they are gone and were supposed to graduate
prevGrads = User.select(User.bnumber).where(User.rawClassLevel == 'Graduating').scalars()
studentData = getStudentData()
newGrads = set(prevGrads) - set([ u["bnumber"] for u in studentData ])
count=User.update(hasGraduated = True).where(User.bnumber.in_(newGrads)).execute()
logger.info(f" {count} students marked as graduated")

# reset isActive and rawClassLevel before importing users
User.update(isActive=False, rawClassLevel=None).execute()

# Import student data
studentData = addToDb(studentData)
studentAdded = studentData[0]
studentUpdated = studentData[1]
logger.info(f" {studentAdded} students were added.")
logger.info(f" {studentUpdated} students were updated.")

# Import faculty data
facultyStaffData = addToDb(getFacultyStaffData())
facultyStaffAdded = facultyStaffData[0]
facultyStaffUpdated = facultyStaffData[1]
logger.info(f" {facultyStaffAdded} faculty/staff were added.")
logger.info(f" {facultyStaffUpdated} faculty/staff were updated.")


logger.info("Getting Preferred Names from LDAP")
ldap = getLdapConn()
Expand Down Expand Up @@ -114,7 +129,7 @@ def updateFromLdap(people):

except Exception as e:
logger.error(f" Failed to update user {bnumber} with preferred name {preferred}: {e}")
logger.info(f" Updated {total_updates} names.")
logger.info(f" {total_updates} names were updated.")

def get_key(entry, key):
if key in entry:
Expand All @@ -129,7 +144,7 @@ def getMssqlCursor():
"host": app.config["tracy"]["host"],
"db": app.config["tracy"]["name"]
}
pyodbc_uri = 'DRIVER=FreeTDS;SERVER={};PORT=1433;DATABASE={};UID={};PWD={};TDS_Version=8.0;'.format(
pyodbc_uri = 'DRIVER=FreeTDS;SERVER={};PORT=1433;DATABASE={};UID={};PWD={};TDS_Version=7.4;'.format(
details['host'], details['db'], details['user'], details['password']
)
try:
Expand Down Expand Up @@ -157,6 +172,7 @@ def addToDb(userList):
email=user['email'],
major=user['major'],
rawClassLevel=user['rawClassLevel'],
isActive=True,
cpoNumber=user['cpoNumber']
).where(User.bnumber == user['bnumber'])).execute()
logger.debug(f" Updated user {user['bnumber']}")
Expand Down
6 changes: 3 additions & 3 deletions app/templates/admin/graduationManagement.html
Original file line number Diff line number Diff line change
Expand Up @@ -56,13 +56,13 @@ <h1 class="text-center mb-3">Graduation Management</h1>
<tbody>
{% for userData in users %}
{% set user = userData['user'] %}
<tr data-status="{% if user.isAlumni %}alumni{% elif user.isCurrentlyEnrolled %}enrolled{% else %}non-enrolled{% endif %}" data-cce-progress="{{ userData['minorProgress'] }}" data-cohort-year="{{ userData['cohort'] }}" data-student-type="{% if user.isBonnerScholar %}bonner{% else %}all{% endif %}" data-username="{{ user.username }}" >
<td style="width: 5%;"><input type="checkbox" class="mx-auto w-100 graduated-checkbox" id="gradCheck" data-username="{{ user.username }}" {% if user.isAlumni %}checked{% endif %}></td>
<tr data-status="{% if user.hasGraduated %}alumni{% elif user.isCurrentlyEnrolled %}enrolled{% else %}non-enrolled{% endif %}" data-cce-progress="{{ userData['minorProgress'] }}" data-cohort-year="{{ userData['cohort'] }}" data-student-type="{% if user.isBonnerScholar %}bonner{% else %}all{% endif %}" data-username="{{ user.username }}" >
<td style="width: 5%;"><input type="checkbox" class="mx-auto w-100 graduated-checkbox" id="gradCheck" data-username="{{ user.username }}" {% if user.hasGraduated %}checked{% endif %}></td>
<td><a href="/profile/{{ user.username }}" target="_blank">{{ user.firstName }} {{ user.lastName }}</a></td>
<td id="{{ user.username }}ClassLevel"> {{ user.processedClassLevel }} </td>
</tr>
{% endfor %}
</tbody>
</table>

{% endblock %}
{% endblock %}
3 changes: 3 additions & 0 deletions database/prod-backup.sql

Large diffs are not rendered by default.

74 changes: 14 additions & 60 deletions tests/code/test_users.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,8 +116,6 @@ def test_isEligibleForProgram():
user.lastHandbookSignature = "2026-07-21"
user.signatureTerm = g.current_term
user.save()
print(user.signatureTerm.academicYear)
print(g.current_term.academicYear)
eligible = isEligibleForProgram(2, user)
assert eligible

Expand Down Expand Up @@ -580,80 +578,36 @@ def test_isCurrentlyEnrolled():
bnumber="B10000004",
email="enrolled@berea.edu",
isStudent=True,
hasGraduated=False,
isActive=True,
rawClassLevel="Junior"
)
assert enrolledUser.isCurrentlyEnrolled is True

# Alumni (graduated)
alumniUser = User.create(
username="alumniuser",
firstName="Alumni",
# inactive user
inactiveUser = User.create(
username="inactiveuser",
firstName="inactive",
lastName="User",
bnumber="B10000005",
email="alumni@berea.edu",
isStudent=False,
hasGraduated=True,
email="inactive@berea.edu",
isStudent=True,
isActive=False,
rawClassLevel="Graduated"
)
assert alumniUser.isCurrentlyEnrolled is False
assert inactiveUser.isCurrentlyEnrolled is False

# Fall graduate (Graduating → Alumni)
fallGradUser = User.create(
# Non-student active user
nonstudentUser = User.create(
username="fallgraduser",
firstName="Fall",
lastName="Grad",
bnumber="B10000006",
email="fall@berea.edu",
isStudent=False,
hasGraduated=False,
isActive=True,
rawClassLevel="Graduating"
)
assert fallGradUser.isCurrentlyEnrolled is False

transaction.rollback()

@pytest.mark.integration
def test_isAlumni():
with mainDB.atomic() as transaction:
# User who has graduated
graduatedUser = User.create(
username="graduser",
firstName="Grad",
lastName="User",
bnumber="B10000001",
email="grad@berea.edu",
isStudent=False,
hasGraduated=True,
rawClassLevel="Graduated"
)
assert graduatedUser.isAlumni is True

# User marked as "Graduating" (Fall graduate)
graduatingUser = User.create(
username="graduatinguser",
firstName="Fall",
lastName="Grad",
bnumber="B10000002",
email="fallgrad@berea.edu",
isStudent=False,
hasGraduated=False,
rawClassLevel="Graduating"
)
assert graduatingUser.isAlumni is True

# Current senior graduating in spring
seniorUser = User.create(
username="senioruser",
firstName="Spring",
lastName="Senior",
bnumber="B10000003",
email="senior@berea.edu",
isStudent=True,
hasGraduated=False,
rawClassLevel="Senior"
)
assert seniorUser.isAlumni is False
assert nonstudentUser.isCurrentlyEnrolled is False

transaction.rollback()

Expand Down Expand Up @@ -684,7 +638,7 @@ def test_processedClassLevel():
hasGraduated=False,
rawClassLevel="Graduating"
)
assert graduatingUser.processedClassLevel == "Alumni"
assert graduatingUser.processedClassLevel == "Graduating"

# Current senior
seniorUser = User.create(
Expand Down
Loading