Files
smoothschedule/smoothschedule/CLAUDE.md
poduck b10426fbdb feat: Add photo galleries to services, resource types management, and UI improvements
Major features:
- Add drag-and-drop photo gallery to Service create/edit modals
- Add Resource Types management section to Settings (CRUD for custom types)
- Add edit icon consistency to Resources table (pencil icon in actions)
- Improve Services page with drag-to-reorder and customer preview mockup

Backend changes:
- Add photos JSONField to Service model with migration
- Add ResourceType model with category (STAFF/OTHER), description fields
- Add ResourceTypeViewSet with CRUD operations
- Add service reorder endpoint for display order

Frontend changes:
- Services page: two-column layout, drag-reorder, photo upload
- Settings page: Resource Types tab with full CRUD modal
- Resources page: Edit icon in actions column instead of row click
- Sidebar: Payments link visibility based on role and paymentsEnabled
- Update types.ts with Service.photos and ResourceTypeDefinition

Note: Removed photos from ResourceType (kept only for Service)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 01:11:53 -05:00

176 lines
6.0 KiB
Markdown

# SmoothSchedule Backend Development Guide
## Docker-Based Development
**IMPORTANT:** This project runs in Docker containers. Do NOT try to run Django commands directly on the host machine - they will fail due to missing environment variables and database connection.
### Running Django Commands
Always use Docker Compose to execute commands:
```bash
# Navigate to the smoothschedule directory first
cd /home/poduck/Desktop/smoothschedule2/smoothschedule
# Run migrations
docker compose -f docker-compose.local.yml exec django python manage.py migrate
# Run migrations for a specific app
docker compose -f docker-compose.local.yml exec django python manage.py migrate schedule
# Make migrations
docker compose -f docker-compose.local.yml exec django python manage.py makemigrations
# Create superuser
docker compose -f docker-compose.local.yml exec django python manage.py createsuperuser
# Run management commands
docker compose -f docker-compose.local.yml exec django python manage.py <command>
# Access Django shell
docker compose -f docker-compose.local.yml exec django python manage.py shell
# Run tests
docker compose -f docker-compose.local.yml exec django pytest
```
### Multi-Tenant Migrations
This is a multi-tenant app using django-tenants. To run migrations on a specific tenant schema:
```bash
# Run on a specific tenant (e.g., 'demo')
docker compose -f docker-compose.local.yml exec django python manage.py tenant_command migrate --schema=demo
# Run on public schema
docker compose -f docker-compose.local.yml exec django python manage.py migrate_schemas --shared
```
### Docker Services
```bash
# Start all services
docker compose -f docker-compose.local.yml up -d
# View logs
docker compose -f docker-compose.local.yml logs -f django
# Restart Django after code changes (usually auto-reloads)
docker compose -f docker-compose.local.yml restart django
# Rebuild after dependency changes
docker compose -f docker-compose.local.yml up -d --build
```
## Project Structure
### Critical Configuration Files
```
smoothschedule/
├── docker-compose.local.yml # Local development Docker config
├── docker-compose.production.yml # Production Docker config
├── .envs/
│ ├── .local/
│ │ ├── .django # Django env vars (SECRET_KEY, DEBUG, etc.)
│ │ └── .postgres # Database credentials
│ └── .production/
│ ├── .django
│ └── .postgres
├── config/
│ ├── settings/
│ │ ├── base.py # Base settings (shared)
│ │ ├── local.py # Local dev settings (imports multitenancy.py)
│ │ ├── production.py # Production settings
│ │ ├── multitenancy.py # Multi-tenant configuration
│ │ └── test.py # Test settings
│ └── urls.py # Main URL configuration
├── compose/
│ ├── local/django/
│ │ ├── Dockerfile # Local Django container
│ │ └── start # Startup script
│ └── production/
│ ├── django/
│ ├── postgres/
│ └── traefik/
```
### Django Apps
```
smoothschedule/smoothschedule/
├── users/ # User management, authentication
│ ├── models.py # User model with roles
│ ├── api_views.py # Auth endpoints, user API
│ └── migrations/
├── schedule/ # Core scheduling functionality
│ ├── models.py # Resource, Event, Service, Participant
│ ├── serializers.py # DRF serializers
│ ├── views.py # ViewSets for API
│ ├── services.py # AvailabilityService
│ └── migrations/
├── tenants/ # Multi-tenancy (Business/Tenant models)
│ ├── models.py # Tenant, Domain models
│ └── migrations/
```
### API Endpoints
Base URL: `http://lvh.me:8000/api/`
- `/api/resources/` - Resource CRUD
- `/api/events/` - Event/Appointment CRUD
- `/api/services/` - Service CRUD
- `/api/customers/` - Customer listing
- `/api/auth/login/` - Authentication
- `/api/auth/logout/` - Logout
- `/api/users/me/` - Current user info
- `/api/business/` - Business settings
## Local Development URLs
- **Backend API:** `http://lvh.me:8000`
- **Frontend:** `http://demo.lvh.me:5173` (business subdomain)
- **Platform Frontend:** `http://platform.lvh.me:5173`
Note: `lvh.me` resolves to `127.0.0.1` and allows subdomain-based multi-tenancy with cookies.
## Database
- **Type:** PostgreSQL with django-tenants
- **Public Schema:** Shared tables (tenants, domains, platform users)
- **Tenant Schemas:** Per-business data (resources, events, customers)
## Common Issues
### 500 Error with No CORS Headers
When Django crashes (500 error), CORS headers aren't sent. Check Django logs:
```bash
docker compose -f docker-compose.local.yml logs django --tail=100
```
### Missing Column/Table Errors
Run migrations:
```bash
docker compose -f docker-compose.local.yml exec django python manage.py migrate
```
### ModuleNotFoundError / ImportError
You're trying to run Python directly instead of through Docker. Use `docker compose exec`.
## Key Models
### Resource (schedule/models.py)
- `name`, `type` (STAFF/ROOM/EQUIPMENT)
- `max_concurrent_events` - concurrency limit (1=exclusive, >1=multilane, 0=unlimited)
- `saved_lane_count` - remembers lane count when multilane disabled
- `buffer_duration` - time between events
### Event (schedule/models.py)
- `title`, `start_time`, `end_time`, `status`
- Links to resources/customers via `Participant` model
### User (users/models.py)
- Roles: `superuser`, `platform_manager`, `platform_support`, `owner`, `manager`, `staff`, `resource`, `customer`
- `business_subdomain` - which tenant they belong to