A modern, full-stack assessment platform built with Django and React. Aztec Assess is designed for educational institutions, with an initial focus on San Diego State University (SDSU).
- Students: Take quizzes, track progress, and review results in a focused workflow.
- Instructors and TAs: Manage courses, members, question banks, topics, and quiz delivery.
- Course/Admin Owners: Control course lifecycle, permissions, and enrollment flows.
Currently in Development - Core platform functionality is implemented and actively improving. Authentication, course lifecycle management, dashboard routing, topic-based question management, and student quiz workflows are live in the codebase. Advanced adaptive behavior, broader analytics/reporting, and deeper AI-assisted tooling are still evolving.
- Multi-role Support: Admin, Instructor, and Student roles
- Email-based Authentication: Secure login with email/password
- Google OAuth: Sign up and log in with Google accounts
- Microsoft OAuth: Sign up and log in with Microsoft accounts
- JWT Token Management: Stateless authentication with refresh tokens stored in HTTP-only cookies
- Auto Token Refresh: Automatic token refresh for seamless user experience
- Signup Policy Controls: Optional allowlist and student-only signup modes via environment flags
- Endpoint Throttling: Auth endpoint-specific rate limits (login/register/oauth/refresh)
- Course Lifecycle: Create, activate, archive, and delete courses
- Status Management: Draft, Active, and Archived states with role-based access
- Join Code System: Generate, enable/disable, rotate, and copy join codes for student enrollment
- Member Management: Add/remove members by email, view member roles and details
- Role-Based UI: Different interfaces and permissions for Owners, Instructors, TAs, and Students
- Topic Management: Course-level topics and question-topic associations
- Instructor Quiz Authoring: Chapters, questions, quizzes, and question import flows
- Bulk Question Import: Import question sets for instructor workflows
- Student Quiz Experience: Quiz landing, in-progress attempts, answer submission, and results views
- Dashboard and Navigation: Role-aware routes, landing page, legal pages, and not-found handling
- Adaptive Engine Expansion: More sophisticated question selection and adaptation logic
- Analytics and Reporting: Richer performance insights for instructors and course teams
- AI Authoring Enhancements: Additional instructor-controlled content assistance features
- Institutional Integrations: Deployment and integration hardening for broader adoption
- Django 5.2 - Web framework
- Django REST Framework - API development
- Neon PostgreSQL - Hosted database service
- JWT Authentication - Secure token-based auth
- Gunicorn - Production-oriented WSGI server runtime
- Poetry - Dependency management
- React 19 - UI framework
- TypeScript - Type safety
- Tailwind CSS - Styling
- Motion - UI animation and transitions
- React Router - Client-side routing
- Axios - HTTP client
- Vite - Build tool
- Docker - Containerization for development and production
- ESLint - Frontend linting
- Pytest - Testing framework
- MyPy - Type checking
- Ruff - Python linting
- Vitest - Frontend test runner
- Frontend: Serverless/static hosting platform (TBD)
- Backend: Managed container hosting platform (TBD)
- Database: Neon PostgreSQL (hosted)
- Docker Desktop installed and running (Download Docker)
- Neon PostgreSQL account (Sign up for free)
- Git (for cloning the repository)
Note
If you prefer not to use Docker, you'll also need Python 3.11+, Node.js 20+, and Poetry. See Manual Setup section below.
git clone https://github.com/adaptive-testers/aztec-assess
cd aztec-assess- Sign up at neon.com and create a new project
- Get your connection string:
- In your Neon dashboard β Project β "Connect"
- Copy the connection string (format:
postgresql://user:pass@host/dbname?sslmode=require)
Create a .env file in the root directory:
# Database (Neon PostgreSQL - required)
DATABASE_URL=postgresql://username:password@ep-xxx.region.aws.neon.tech/dbname?sslmode=require
# Django Settings (required)
SECRET_KEY=your-secret-key-here-make-it-long-and-random
DEBUG=True
ALLOWED_HOSTS=localhost,127.0.0.1,backend
CORS_ALLOWED_ORIGINS=http://localhost:5173,http://127.0.0.1:5173,http://localhost:80
CSRF_TRUSTED_ORIGINS=http://localhost:5173,http://127.0.0.1:5173
ENABLE_DJANGO_ADMIN=True
ENABLE_API_DOCS=True
SIGNUP_ALLOWLIST_ENABLED=False
STUDENT_MODE_ONLY=False
# Google OAuth (optional - for Google sign-in)
GOOGLE_CLIENT_ID=your-google-client-id
GOOGLE_CLIENT_SECRET=your-google-client-secret
GOOGLE_REDIRECT_URI=http://localhost:5173
# Microsoft OAuth (optional)
MICROSOFT_CLIENT_ID=your-microsoft-client-id
MICROSOFT_TENANT_ID=common
MICROSOFT_REDIRECT_URI=http://localhost:5173/auth-callback.htmlQuick Setup:
- SECRET_KEY: Generate one with:
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())" - Google OAuth: Optional - only needed if you want Google sign-in. Leave blank if not using.
- Never commit the
.envfile to version control
Production Deployment Overrides (recommended):
DEBUG=False
ENABLE_DJANGO_ADMIN=False
ENABLE_API_DOCS=False
# Endpoint-specific auth throttles
AUTH_THROTTLE_LOGIN_RATE=60/hour
AUTH_THROTTLE_REGISTER_RATE=30/hour
AUTH_THROTTLE_OAUTH_RATE=60/hour
AUTH_THROTTLE_TOKEN_REFRESH_RATE=600/hour
# HTTPS / proxy hardening
COOKIE_SECURE=True
SESSION_COOKIE_SECURE=True
CSRF_COOKIE_SECURE=True
COOKIE_SAMESITE=Lax
SECURE_PROXY_SSL_HEADER=HTTP_X_FORWARDED_PROTO,https
USE_X_FORWARDED_HOST=True
SECURE_SSL_REDIRECT=True
SECURE_HSTS_SECONDS=31536000
SECURE_HSTS_INCLUDE_SUBDOMAINS=True
SECURE_HSTS_PRELOAD=True
SECURE_REFERRER_POLICY=strict-origin-when-cross-origindocker compose up --build frontend-dev backendThis builds the containers and starts both services. The first build may take a few minutes.
In a new terminal (while Docker is running):
# Create database tables
docker compose exec backend /app/.venv/bin/python manage.py migrate
# Create admin account (you'll be prompted for email and password)
docker compose exec backend /app/.venv/bin/python manage.py createsuperuserOpen your browser to:
- Frontend: http://localhost:5173
- Backend API: http://localhost:8000
- Admin Panel: http://localhost:8000/admin (if enabled)
- API Docs: http://localhost:8000/api/docs (if enabled)
First Time:
- Sign up for a new account or use your superuser credentials
- Select your role (Student or Instructor) when prompted
# Start services
docker compose up frontend-dev backend
# Stop services
docker compose down
# View logs
docker compose logs -f
# Run backend commands
docker compose exec backend /app/.venv/bin/python manage.py <command>
# Rebuild after dependency changes
docker compose up --build frontend-dev backendDatabase Connection:
- Verify
DATABASE_URLin.envincludes?sslmode=require - Check Neon dashboard to ensure database is active (not paused)
Port Conflicts:
- Ports 5173 or 8000 in use? Stop conflicting services or modify
docker-compose.yml
Build Issues:
- Ensure Docker Desktop is running
- Try:
docker compose build --no-cache - Check logs:
docker compose logs backend
If you prefer not to use Docker, you can set up the project manually. This requires installing Python, Node.js, and their dependencies directly on your system.
- Python 3.11+ installed and accessible in your PATH
- Node.js 20+ and npm installed
- Poetry for Python dependency management:
pip install poetryor follow Poetry installation guide - Neon PostgreSQL account and database (same as Docker setup)
-
Clone the repository (if you haven't already)
git clone https://github.com/adaptive-testers/aztec-assess cd aztec-assess/backend -
Install Python dependencies
poetry install poetry shell # Activates the virtual environment -
Create
.envfile in the backend directory (seebackend/.env.examplefor all options)DATABASE_URL=postgresql://username:password@ep-xxx.region.aws.neon.tech/dbname?sslmode=require SECRET_KEY=your-secret-key-here DEBUG=True ALLOWED_HOSTS=localhost,127.0.0.1 CORS_ALLOWED_ORIGINS=http://localhost:5173,http://127.0.0.1:5173 GOOGLE_CLIENT_ID=your-google-client-id GOOGLE_CLIENT_SECRET=your-google-client-secret GOOGLE_REDIRECT_URI=http://localhost:5173 MICROSOFT_CLIENT_ID=your-microsoft-client-id MICROSOFT_TENANT_ID=common MICROSOFT_REDIRECT_URI=http://localhost:5173/auth-callback.htmlCreate
frontend/.envwithVITE_GOOGLE_CLIENT_ID,VITE_MICROSOFT_CLIENT_ID,VITE_MICROSOFT_TENANT_ID(seefrontend/.env.example). -
Run database migrations
python manage.py migrate
-
Create a superuser account
python manage.py createsuperuser
You'll be prompted for:
- Email address
- Password (enter twice)
-
Start the development server
python manage.py runserver
The backend API will be available at: http://localhost:8000
-
Open a new terminal and navigate to the frontend directory
cd aztec-assess/frontend -
Install Node.js dependencies
npm install
-
Start the development server
npm run dev
The frontend will be available at: http://localhost:5173
Note
Docker is recommended for consistent development environments. Manual setup is useful for debugging or if you prefer working directly with the tools.
Python/Poetry:
- Install Poetry:
curl -sSL https://install.python-poetry.org | python3 - - Activate shell:
poetry shell
Node.js:
- Verify version:
node --version(needs 20+) - If install fails:
npm install --legacy-peer-deps
cd backend
poetry install --no-interaction --no-root
poetry run ruff check .
poetry run mypy .
poetry run pytest
poetry run pytest --cov=apps --cov-report=htmlcd frontend
npm ci
npm run lint
npm run test:run
npm run test:coverage
npm run buildaztec-assess/
βββ backend/ # Django backend
β βββ adaptive_testing/ # Main Django project
β β βββ settings/ # Environment-specific settings
β β βββ ...
β βββ apps/ # Django applications
β β βββ accounts/ # User management and authentication
β β βββ courses/ # Course management, enrollment, and topics
β β βββ quizzes/ # Chapters, questions, quizzes, attempts, imports
β βββ Dockerfile # Backend container configuration
β βββ .dockerignore # Files excluded from Docker build
β βββ manage.py
β βββ pyproject.toml
βββ frontend/ # React frontend
β βββ src/
β β βββ features/ # Feature-based components
β β β βββ Course/ # Course settings, join flow, and students page
β β β βββ CourseCreation/ # Course creation page
β β β βββ Dashboard/ # Dashboard layout and landing view
β β β βββ InstructorCourse/ # Instructor quiz/course management
β β β βββ Landing/ # Public landing page
β β β βββ Legal/ # Privacy, terms, and cookies pages
β β β βββ LogIn/ # Login page
β β β βββ NotFound/ # 404 page
β β β βββ Profile/ # User profile page
β β β βββ SignUp/ # Signup and role selection
β β β βββ StudentQuizzes/ # Student quiz attempt flow
β β βββ components/ # Reusable components
β β β βββ Sidebar/ # Navigation sidebar
β β β βββ ProtectedRoute.tsx
β β β βββ PublicRoute.tsx
β β βββ context/ # Auth and role context providers
β β βββ api/ # API client configuration
β β βββ test/ # Test files
β β βββ types/ # TypeScript type definitions
β βββ Dockerfile # Multi-stage frontend container
β βββ .dockerignore # Files excluded from Docker build
β βββ nginx.conf # Nginx config for production
β βββ package.json
βββ docker-compose.yml # Docker Compose configuration
βββ .env # Environment variables (create this)
βββ README.md
The project uses Docker for consistent development environments. The setup includes:
- Multi-stage builds: Optimized Docker images for development and production
- Hot reload: Code changes are automatically reflected in development containers
- Volume mounting: Source code is mounted for instant updates
- Isolated dependencies: Node modules and Python virtual environments are containerized
- Python: Ruff for linting, MyPy for type checking, Pytest for backend tests
- TypeScript: ESLint for linting, Vitest for frontend tests
- Pre-commit hooks: Automated checks before commits
This project is licensed under the MIT License - see the LICENSE file for details.
We welcome contributions! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
If you have any questions or need help, please open an issue in the repository.



