Last Updated: November 25, 2025
Production Domain: dlink.cs.uno.edu
Branch: dev-main
The Course Equivalency and Transfer Planning System is a web application designed for academic advisors and students to manage course equivalencies, create degree plans, and track progress toward degree completion.
Core Capabilities:
cd backend
python -m venv venv
source venv/bin/activate # or venv\Scripts\activate on Windows
pip install -r requirements.txt
# Configure environment
cp .env.example .env
# Edit .env with your DATABASE_URL and other settings
# Initialize database
flask db upgrade
# Run development server
flask run
cd frontend
npm install
# Configure environment
cp .env.example .env.local
# Edit .env.local with your API URL
# Run development server
npm run dev
# Build for production
npm run build
Backend:
Frontend:
API Endpoints:
POST /api/advisor-auth/request-code - Request TOTP setup or email codePOST /api/advisor-auth/verify-code - Verify code and create sessionPOST /api/advisor-auth/regenerate-totp - Generate new TOTP secretGET /api/advisor-auth/verify-session - Check session validityPOST /api/advisor-auth/logout - Logout and clear sessionGET /api/advisor-auth/whitelist - List whitelisted advisors (admin only)POST /api/advisor-auth/whitelist - Add advisor (admin only)POST /api/advisor-auth/whitelist/bulk - Bulk add advisors via CSV (admin only)DELETE /api/advisor-auth/whitelist/:id - Remove advisor (admin only)X-Admin-Token headerADMIN_API_TOKEN environment variableType: PostgreSQL
Migration Tool: Flask-Migrate (Alembic)
Core Tables:
courses - Course catalog (all institutions)equivalencies - Course equivalency mappingsprograms - Degree programs with versionsprogram_requirements - Requirement categoriesrequirement_groups - Course groupings within requirementsgroup_course_options - Specific course options for groupsrequirement_constraints - Validation rules (credits, courses, level, tags)plans - Individual student degree plansplan_courses - Courses assigned to plansadvisor_auth - Advisor whitelist and authenticationsimple: Pool of courses, choose any to meet credit goalgrouped: Multiple mandatory subdivisions, must satisfy ALL groupsConstraints can apply at category-level or group-level:
Constraint Features:
Location: Course-level validation
Storage: courses.prerequisites field (comma-separated)
Service: backend/services/prerequisite_service.py
Features:
API Endpoints:
GET /api/prerequisites/check/<course_code>?plan_id=XGET /api/prerequisites/details/<course_code>GET /api/prerequisites/validate-plan/<plan_id>GET /api/prerequisites/suggest-next-courses/<plan_id>Upload Types:
Key Features:
Features:
Framework: React + Vite
Styling: TailwindCSS
Key Components:
AppShell.jsx - Main navigation and layoutProgressTracking.jsx - Requirement progress display with constraint validationAdvisorAuthModal.jsx - Advisor authenticationAppManagementPage.jsx - Admin whitelist managementCSVUpload.jsx - File upload interfaceAddCourseToPlanModal.jsx - Course addition with validationbackend/
├── app.py # Flask application
├── config.py # Configuration
├── auth.py # Authentication decorators
├── models/
│ ├── course.py # Course model
│ ├── equivalency.py # Equivalency model
│ ├── program.py # Program & requirement models
│ ├── constraint.py # Constraint model
│ ├── plan.py # Plan & plan_courses models
│ └── advisor_auth.py # Advisor authentication
├── routes/
│ ├── courses.py # Course endpoints
│ ├── equivalencies.py # Equivalency endpoints
│ ├── programs.py # Program endpoints
│ ├── plans.py # Plan endpoints
│ ├── upload.py # CSV upload endpoints
│ ├── qr.py # QR code generation
│ ├── prerequisites.py # Prerequisite validation
│ └── advisor_auth.py # Advisor auth endpoints
└── services/
├── prerequisite_service.py # Prerequisite logic
└── progress_service.py # Progress calculation
frontend/
├── src/
│ ├── App.jsx
│ ├── components/
│ │ ├── AppShell.jsx
│ │ ├── AdvisorAuthModal.jsx
│ │ ├── ProgressTracking.jsx
│ │ ├── CSVUpload.jsx
│ │ └── ...
│ ├── pages/
│ │ ├── AppManagementPage.jsx
│ │ └── ...
│ └── services/
│ └── api.js
└── public/
DATABASE_URL=postgresql://ct_user:DeptOfCs@localhost:5432/course_transfer
ADMIN_API_TOKEN=your_admin_token
FLASK_ENV=development
SECRET_KEY=your_secret_key
VITE_API_BASE_URL=http://localhost:5000
VITE_ADMIN_API_TOKEN=your_admin_token
http://localhost:5000http://localhost:5173089292 for advisor accessPRODUCTION_BACKDOOR.md for SMTP configuration stepscd backend
pytest
Test Coverage:
cd frontend
npm run build
Development Team: UNO CS Department
Repository: mmennelle/course-equivalency
Branch: dev-main
Production URL: dlink.cs.uno.edu