Initial commit: SmoothSchedule multi-tenant scheduling platform
This commit includes: - Django backend with multi-tenancy (django-tenants) - React + TypeScript frontend with Vite - Platform administration API with role-based access control - Authentication system with token-based auth - Quick login dev tools for testing different user roles - CORS and CSRF configuration for local development - Docker development environment setup 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
184
setup_project.sh
Normal file
184
setup_project.sh
Normal file
@@ -0,0 +1,184 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Smooth Schedule - Multi-Tenant SaaS Platform Setup Script
|
||||
# This script initializes a production-grade Django project with strict multi-tenancy
|
||||
|
||||
set -e # Exit on any error
|
||||
|
||||
echo "=================================================="
|
||||
echo "Smooth Schedule - Project Initialization"
|
||||
echo "=================================================="
|
||||
|
||||
# Color definitions for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Check if cookiecutter is installed
|
||||
if ! command -v cookiecutter &> /dev/null; then
|
||||
echo -e "${RED}Error: cookiecutter is not installed${NC}"
|
||||
echo "Install it with: pip install cookiecutter"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Project configuration
|
||||
PROJECT_NAME="Smooth Schedule"
|
||||
PROJECT_SLUG="smoothschedule"
|
||||
AUTHOR_NAME="Smooth Schedule Team"
|
||||
EMAIL="admin@smoothschedule.com"
|
||||
DESCRIPTION="Multi-Tenant SaaS Resource Orchestration Platform"
|
||||
DOMAIN_NAME="smoothschedule.com"
|
||||
|
||||
echo -e "${GREEN}Step 1: Running cookiecutter-django...${NC}"
|
||||
|
||||
# Run cookiecutter with non-interactive mode
|
||||
cookiecutter gh:cookiecutter/cookiecutter-django \
|
||||
--no-input \
|
||||
project_name="${PROJECT_NAME}" \
|
||||
project_slug="${PROJECT_SLUG}" \
|
||||
description="${DESCRIPTION}" \
|
||||
author_name="${AUTHOR_NAME}" \
|
||||
email="${EMAIL}" \
|
||||
domain_name="${DOMAIN_NAME}" \
|
||||
version="0.1.0" \
|
||||
open_source_license="MIT" \
|
||||
timezone="UTC" \
|
||||
windows="n" \
|
||||
use_pycharm="n" \
|
||||
use_docker="y" \
|
||||
postgresql_version="14" \
|
||||
cloud_provider="AWS" \
|
||||
mail_service="Mailgun" \
|
||||
use_async="n" \
|
||||
use_drf="y" \
|
||||
frontend_pipeline="None" \
|
||||
use_celery="y" \
|
||||
use_mailhog="y" \
|
||||
use_sentry="y" \
|
||||
use_whitenoise="y" \
|
||||
use_heroku="n" \
|
||||
ci_tool="Github" \
|
||||
keep_local_envs_in_vcs="y" \
|
||||
debug="n"
|
||||
|
||||
cd "${PROJECT_SLUG}"
|
||||
|
||||
echo -e "${GREEN}Step 2: Aggressive De-bloating...${NC}"
|
||||
|
||||
# Remove templates directory (we're using React frontend)
|
||||
if [ -d "${PROJECT_SLUG}/templates" ]; then
|
||||
echo -e "${YELLOW}Removing templates/ directory...${NC}"
|
||||
rm -rf "${PROJECT_SLUG}/templates"
|
||||
echo "✓ Removed templates/"
|
||||
fi
|
||||
|
||||
# Remove pages app (standard About/Home views)
|
||||
if [ -d "${PROJECT_SLUG}/pages" ]; then
|
||||
echo -e "${YELLOW}Removing pages app...${NC}"
|
||||
rm -rf "${PROJECT_SLUG}/pages"
|
||||
echo "✓ Removed pages app"
|
||||
fi
|
||||
|
||||
# Remove allauth account templates (we're using DRF for auth)
|
||||
if [ -d "${PROJECT_SLUG}/templates/account" ]; then
|
||||
echo -e "${YELLOW}Removing allauth account templates...${NC}"
|
||||
rm -rf "${PROJECT_SLUG}/templates/account"
|
||||
echo "✓ Removed allauth templates"
|
||||
fi
|
||||
|
||||
# Remove contrib directory if it exists (often contains page views)
|
||||
if [ -d "${PROJECT_SLUG}/contrib" ]; then
|
||||
echo -e "${YELLOW}Removing contrib directory...${NC}"
|
||||
rm -rf "${PROJECT_SLUG}/contrib"
|
||||
echo "✓ Removed contrib/"
|
||||
fi
|
||||
|
||||
# Clean up settings to remove references to deleted apps
|
||||
echo -e "${YELLOW}Cleaning up settings files...${NC}"
|
||||
|
||||
# Remove pages from INSTALLED_APPS in all settings files
|
||||
for settings_file in config/settings/*.py; do
|
||||
if [ -f "$settings_file" ]; then
|
||||
sed -i '/pages/d' "$settings_file" 2>/dev/null || true
|
||||
sed -i '/contrib/d' "$settings_file" 2>/dev/null || true
|
||||
fi
|
||||
done
|
||||
|
||||
# Remove pages URLs if they exist
|
||||
if [ -f "config/urls.py" ]; then
|
||||
sed -i '/pages/d' "config/urls.py" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}Step 3: Installing additional dependencies...${NC}"
|
||||
|
||||
# Create requirements directory if it doesn't exist
|
||||
mkdir -p requirements
|
||||
|
||||
# Add django-tenants to base requirements
|
||||
if [ -f "requirements/base.txt" ]; then
|
||||
echo "" >> requirements/base.txt
|
||||
echo "# Multi-Tenancy" >> requirements/base.txt
|
||||
echo "django-tenants==3.5.0" >> requirements/base.txt
|
||||
echo "" >> requirements/base.txt
|
||||
echo "# Security & Masquerading" >> requirements/base.txt
|
||||
echo "django-hijack==3.4.1" >> requirements/base.txt
|
||||
echo "✓ Added django-tenants and django-hijack to requirements"
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}Step 4: Creating core application structure...${NC}"
|
||||
|
||||
# Create core app
|
||||
python manage.py startapp core
|
||||
|
||||
# Create additional required directories
|
||||
mkdir -p core/migrations
|
||||
mkdir -p core/management/commands
|
||||
mkdir -p logs
|
||||
|
||||
# Create __init__.py files
|
||||
touch core/__init__.py
|
||||
touch core/management/__init__.py
|
||||
touch core/management/commands/__init__.py
|
||||
|
||||
echo "✓ Created core app structure"
|
||||
|
||||
echo -e "${GREEN}Step 5: Verification...${NC}"
|
||||
|
||||
# Verify Django Admin is intact
|
||||
if [ -f "config/urls.py" ]; then
|
||||
if grep -q "admin.site.urls" "config/urls.py"; then
|
||||
echo "✓ Django Admin is preserved"
|
||||
else
|
||||
echo -e "${RED}Warning: Django Admin may not be properly configured${NC}"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Verify de-bloat
|
||||
if [ ! -d "${PROJECT_SLUG}/templates" ]; then
|
||||
echo "✓ Templates directory removed"
|
||||
else
|
||||
echo -e "${RED}Warning: Templates directory still exists${NC}"
|
||||
fi
|
||||
|
||||
if [ ! -d "${PROJECT_SLUG}/pages" ]; then
|
||||
echo "✓ Pages app removed"
|
||||
else
|
||||
echo -e "${RED}Warning: Pages app still exists${NC}"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "=================================================="
|
||||
echo -e "${GREEN}Smooth Schedule Project Initialization Complete!${NC}"
|
||||
echo "=================================================="
|
||||
echo ""
|
||||
echo "Next Steps:"
|
||||
echo "1. cd ${PROJECT_SLUG}"
|
||||
echo "2. Review the generated settings in config/settings/"
|
||||
echo "3. Set up your .env file with database credentials"
|
||||
echo "4. Run: docker-compose build"
|
||||
echo "5. Run: docker-compose up"
|
||||
echo ""
|
||||
echo "Note: Django Admin is accessible at /admin/"
|
||||
echo " (This is the only HTML interface allowed)"
|
||||
echo ""
|
||||
Reference in New Issue
Block a user