Implement comprehensive email verification and admin approval system for user registration. Users must verify their email before logging in, and admins must approve new users before they can access the system. Major features: - Email verification with UUID tokens (24hr expiry, one-time use) - Admin approval workflow via Django admin interface - Custom authentication backend enforcing verification and approval - Password change functionality for authenticated users - Enhanced profile page with proper styling and theme support - Collect first name, last name, and timezone during registration - Profile link added to header navigation Email notifications: - Verification email sent after registration - Admin notification when users need approval - Approval notification sent to users Security features: - Cryptographically secure UUID tokens - Token expiration and one-time use enforcement - Email enumeration protection - Custom JWT token validation for API access - Existing users auto-approved via data migration Templates added: - Email templates (verification, approval, admin notification) - Web templates (password change, verification pages) - Enhanced profile page with dark/light mode support 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
KeepItGoing Server
A powerful Django-based task management system with time tracking, tag organization, and real-time collaboration features.
Features
Task Management
- Hierarchical Tasks: Support for parent tasks and subtasks
- Priority Levels: Low, Medium, High, and Urgent
- Status Tracking: Pending, In Progress, Completed, Cancelled
- Due Dates & Times: Set specific due dates and times for tasks
- Recurrence: Daily, Weekly, Bi-weekly, Monthly, Yearly, and Custom patterns
Organization
- Tag-Based System: Organize tasks with multiple colored tags
- Smart Filtering: View tasks by All, Today, Upcoming, Overdue, or Completed
- Auto-Tag Assignment: New tasks automatically inherit the active filter tag
- Flexible Sorting: Sort by due date (earliest/latest) or priority (high-to-low/low-to-high)
Time Tracking
- Start/Stop Timers: Built-in time tracking for tasks
- Time Entry History: View detailed time logs for each task
- Formatted Display: Time shown as H:MM:SS with visual indicators
- Running Timer Display: Always visible timer in the UI when tracking time
Collaboration
- Task Sharing: Share individual tasks or entire tags with other users
- Multi-user Support: Full authentication and user management
- Shared Views: See tasks shared with you alongside your own
User Interface
- 3-Pane Layout: Sidebar navigation, task list, and detail panel
- Responsive Design: Works on desktop, tablet, and mobile
- Dark Mode: Built-in dark/light theme toggle
- Quick Add: Fast task creation from any filter view
- Inline Actions: Toggle completion, start/stop timers without leaving the list
API & Sync
- RESTful API: Full REST API for programmatic access
- Mobile App Support: Sync protocol for Android app
- Real-time Updates: Task changes sync across devices
- Conflict Resolution: Handles offline changes and syncing
Tech Stack
- Backend: Django 5.x, Django REST Framework
- Database: SQLite (development), PostgreSQL-compatible
- Task Queue: Celery with Redis
- Authentication: JWT tokens with session support
- Frontend: HTML5, CSS3, Vanilla JavaScript
- Deployment: Docker support included
Installation
Prerequisites
- Python 3.12+
- pip
- virtualenv (recommended)
Quick Start
-
Clone the repository
git clone https://git.firebugit.com/Firebug_IT/KeepItGoingServer.git cd KeepItGoingServer -
Create virtual environment
python3 -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activate -
Install dependencies
pip install -r requirements.txt -
Configure environment
cp .env.example .env # Edit .env with your settings -
Run migrations
export DJANGO_SETTINGS_MODULE=config.settings.development python manage.py migrate -
Create superuser
python manage.py createsuperuser -
Run development server
python manage.py runserver -
Access the application
- Web Interface: http://localhost:8000
- Admin Panel: http://localhost:8000/admin
- API Root: http://localhost:8000/api/
Configuration
Settings Modules
The project uses different settings modules for different environments:
config.settings.development- Local developmentconfig.settings.production- Production deploymentconfig.settings.selfhosted- Self-hosted instances
Set via environment variable:
export DJANGO_SETTINGS_MODULE=config.settings.development
Database Configuration
The application supports multiple database backends. Choose the one that fits your needs.
SQLite3 (Default - Development)
SQLite3 is the default database and requires no additional setup. It's perfect for development and single-user scenarios.
Configuration in config/settings/development.py:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
Pros:
- Zero configuration
- No separate database server needed
- Perfect for development and testing
Cons:
- Not recommended for production with multiple users
- Limited concurrent write operations
- No network access (local file only)
PostgreSQL (Recommended for Production)
PostgreSQL is the recommended database for production deployments.
1. Install PostgreSQL:
# Ubuntu/Debian
sudo apt-get install postgresql postgresql-contrib libpq-dev
# macOS
brew install postgresql
2. Create database and user:
sudo -u postgres psql
CREATE DATABASE keepitgoing;
CREATE USER keepitgoing_user WITH PASSWORD 'your_secure_password';
ALTER ROLE keepitgoing_user SET client_encoding TO 'utf8';
ALTER ROLE keepitgoing_user SET default_transaction_isolation TO 'read committed';
ALTER ROLE keepitgoing_user SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE keepitgoing TO keepitgoing_user;
\q
3. Install Python driver:
pip install psycopg2-binary
4. Update settings:
Add to your .env file:
DATABASE_URL=postgresql://keepitgoing_user:your_secure_password@localhost:5432/keepitgoing
Or configure directly in settings:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'keepitgoing',
'USER': 'keepitgoing_user',
'PASSWORD': 'your_secure_password',
'HOST': 'localhost',
'PORT': '5432',
}
}
5. Run migrations:
python manage.py migrate
MariaDB/MySQL
MariaDB and MySQL are also supported for production use.
1. Install MariaDB:
# Ubuntu/Debian
sudo apt-get install mariadb-server libmariadb-dev
# macOS
brew install mariadb
2. Create database and user:
sudo mysql
CREATE DATABASE keepitgoing CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'keepitgoing_user'@'localhost' IDENTIFIED BY 'your_secure_password';
GRANT ALL PRIVILEGES ON keepitgoing.* TO 'keepitgoing_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
3. Install Python driver:
pip install mysqlclient
4. Update settings:
Add to your .env file:
DATABASE_URL=mysql://keepitgoing_user:your_secure_password@localhost:3306/keepitgoing
Or configure directly in settings:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'keepitgoing',
'USER': 'keepitgoing_user',
'PASSWORD': 'your_secure_password',
'HOST': 'localhost',
'PORT': '3306',
'OPTIONS': {
'charset': 'utf8mb4',
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
},
}
}
5. Run migrations:
python manage.py migrate
Database Migration Between Backends
To migrate data from one database to another:
1. Export data from current database:
python manage.py dumpdata --natural-foreign --natural-primary \
-e contenttypes -e auth.Permission --indent 4 > data.json
2. Update database settings to new backend
3. Run migrations on new database:
python manage.py migrate --run-syncdb
4. Import data:
python manage.py loaddata data.json
Environment Variables
Key environment variables (see .env.example):
SECRET_KEY- Django secret key (required in production)DEBUG- Enable debug mode (True/False)ALLOWED_HOSTS- Comma-separated list of allowed hostsDATABASE_URL- Database connection string (optional, overrides settings)REDIS_URL- Redis connection for CeleryCSRF_TRUSTED_ORIGINS- HTTPS origins for CSRF
API Documentation
Authentication
The API supports both session-based and token-based authentication.
Get Token:
POST /api/auth/login/
{
"email": "user@example.com",
"password": "password"
}
Use Token:
Authorization: Bearer <token>
Endpoints
Tasks
GET /api/tasks/- List all tasksPOST /api/tasks/- Create taskGET /api/tasks/{id}/- Get task detailsPUT /api/tasks/{id}/- Update taskDELETE /api/tasks/{id}/- Delete task
Tags
GET /api/tags/- List all tagsPOST /api/tags/- Create tagGET /api/tags/{id}/- Get tag detailsPUT /api/tags/{id}/- Update tagDELETE /api/tags/{id}/- Delete tag
Time Entries
GET /api/time-entries/- List time entriesPOST /api/time-entries/- Create time entryPOST /api/tasks/{id}/start-timer/- Start timerPOST /api/time-entries/{id}/stop/- Stop timer
Sync (Mobile)
POST /api/sync/sync/- Bidirectional sync endpoint
Project Structure
keepitgoing-server/
├── config/ # Project configuration
│ ├── settings/ # Environment-specific settings
│ ├── urls.py # Main URL configuration
│ └── wsgi.py # WSGI entry point
├── tasks/ # Task management app
│ ├── models.py # Task, Tag, TimeEntry models
│ ├── views.py # API and web views
│ ├── serializers.py # DRF serializers
│ └── migrations/ # Database migrations
├── users/ # User management app
├── sync/ # Mobile sync app
├── notifications/ # Notification system
├── templates/ # Django templates
│ ├── base.html # Base template
│ └── tasks/ # Task templates
├── static/ # Static files
│ ├── css/ # Stylesheets
│ └── js/ # JavaScript
├── manage.py # Django management script
└── requirements.txt # Python dependencies
Docker Deployment
Development
docker-compose -f docker-compose.dev.yml up
Production
docker-compose up -d
Database Models
Task
- Hierarchical structure (parent/subtasks)
- Multiple tags per task
- Due date and time
- Priority and status
- Recurrence patterns
- Soft delete support
Tag
- Color-coded organization
- Multi-task assignment
- Sort ordering
- Archive capability
TimeEntry
- Start/end timestamps
- Duration calculation
- User association
TaskShare
- Share tasks or entire tags
- User-to-user sharing
- Permission management
Development
Running Tests
python manage.py test
Creating Migrations
python manage.py makemigrations
Collecting Static Files
python manage.py collectstatic
Code Style
- Follow PEP 8 for Python code
- Use meaningful variable names
- Add docstrings to functions and classes
Deployment
Production Checklist
- Set
DEBUG = False - Configure strong
SECRET_KEY - Set up proper
ALLOWED_HOSTS - Configure
CSRF_TRUSTED_ORIGINSfor HTTPS - Use PostgreSQL instead of SQLite
- Set up Redis for Celery
- Configure static file serving
- Set up SSL/TLS certificates
- Configure backup strategy
- Set up monitoring and logging
Nginx Configuration
Example nginx config for reverse proxy:
server {
listen 443 ssl;
server_name tasks.firebugit.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /static/ {
alias /path/to/static/;
}
}
Mobile App Integration
This server works with the KeepItGoing Android app via the sync endpoint.
Sync Protocol:
- Client sends current state and last sync timestamp
- Server returns updates since last sync
- Server accepts client changes
- Conflict resolution handled server-side
Contributing
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
License
Proprietary - All Rights Reserved Copyright (c) 2025 Firebug IT
Support
For issues and questions:
- Create an issue in the repository
- Email: keith@firebugit.com
Changelog
Version 1.0.0 (2025-01-18)
- Initial release
- Complete task management system
- Tag-based organization
- Time tracking
- Multi-user support
- Mobile app sync
- Web interface with dark mode
- Responsive design
- RESTful API
Built with ❤️ by Firebug IT