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:
195
smoothschedule/pyproject.toml
Normal file
195
smoothschedule/pyproject.toml
Normal file
@@ -0,0 +1,195 @@
|
||||
# ==== pytest ====
|
||||
[tool.pytest.ini_options]
|
||||
minversion = "6.0"
|
||||
addopts = "--ds=config.settings.test --reuse-db --import-mode=importlib"
|
||||
python_files = [
|
||||
"tests.py",
|
||||
"test_*.py",
|
||||
]
|
||||
|
||||
# ==== Coverage ====
|
||||
[tool.coverage.run]
|
||||
include = ["smoothschedule/**"]
|
||||
omit = ["*/migrations/*", "*/tests/*"]
|
||||
plugins = ["django_coverage_plugin"]
|
||||
|
||||
# ==== mypy ====
|
||||
[tool.mypy]
|
||||
python_version = "3.13"
|
||||
check_untyped_defs = true
|
||||
ignore_missing_imports = true
|
||||
warn_unused_ignores = true
|
||||
warn_redundant_casts = true
|
||||
warn_unused_configs = true
|
||||
plugins = [
|
||||
"mypy_django_plugin.main",
|
||||
"mypy_drf_plugin.main",
|
||||
]
|
||||
|
||||
[[tool.mypy.overrides]]
|
||||
# Django migrations should not produce any errors:
|
||||
module = "*.migrations.*"
|
||||
ignore_errors = true
|
||||
|
||||
[tool.django-stubs]
|
||||
django_settings_module = "config.settings.test"
|
||||
|
||||
# ==== djLint ====
|
||||
[tool.djlint]
|
||||
blank_line_after_tag = "load,extends"
|
||||
close_void_tags = true
|
||||
format_css = true
|
||||
format_js = true
|
||||
# TODO: remove T002 when fixed https://github.com/djlint/djLint/issues/687
|
||||
ignore = "H006,H030,H031,T002"
|
||||
include = "H017,H035"
|
||||
indent = 2
|
||||
max_line_length = 119
|
||||
profile = "django"
|
||||
|
||||
[tool.djlint.css]
|
||||
indent_size = 2
|
||||
|
||||
[tool.djlint.js]
|
||||
indent_size = 2
|
||||
|
||||
[tool.ruff]
|
||||
# Exclude a variety of commonly ignored directories.
|
||||
extend-exclude = [
|
||||
"*/migrations/*.py",
|
||||
"staticfiles/*",
|
||||
]
|
||||
|
||||
[tool.ruff.lint]
|
||||
select = [
|
||||
"F",
|
||||
"E",
|
||||
"W",
|
||||
"C90",
|
||||
"I",
|
||||
"N",
|
||||
"UP",
|
||||
"YTT",
|
||||
# "ANN", # flake8-annotations: we should support this in the future but 100+ errors atm
|
||||
"ASYNC",
|
||||
"S",
|
||||
"BLE",
|
||||
"FBT",
|
||||
"B",
|
||||
"A",
|
||||
"COM",
|
||||
"C4",
|
||||
"DTZ",
|
||||
"T10",
|
||||
"DJ",
|
||||
"EM",
|
||||
"EXE",
|
||||
"FA",
|
||||
'ISC',
|
||||
"ICN",
|
||||
"G",
|
||||
'INP',
|
||||
'PIE',
|
||||
"T20",
|
||||
'PYI',
|
||||
'PT',
|
||||
"Q",
|
||||
"RSE",
|
||||
"RET",
|
||||
"SLF",
|
||||
"SLOT",
|
||||
"SIM",
|
||||
"TID",
|
||||
"TC",
|
||||
"INT",
|
||||
# "ARG", # Unused function argument
|
||||
"PTH",
|
||||
"ERA",
|
||||
"PD",
|
||||
"PGH",
|
||||
"PL",
|
||||
"TRY",
|
||||
"FLY",
|
||||
# "NPY",
|
||||
# "AIR",
|
||||
"PERF",
|
||||
# "FURB",
|
||||
# "LOG",
|
||||
"RUF",
|
||||
]
|
||||
ignore = [
|
||||
"S101", # Use of assert detected https://docs.astral.sh/ruff/rules/assert/
|
||||
"RUF012", # Mutable class attributes should be annotated with `typing.ClassVar`
|
||||
"SIM102", # sometimes it's better to nest
|
||||
# of types for comparison.
|
||||
# Deactivated because it can make the code slow:
|
||||
# https://github.com/astral-sh/ruff/issues/7871
|
||||
]
|
||||
|
||||
[tool.ruff.lint.isort]
|
||||
force-single-line = true
|
||||
|
||||
[dependency-groups]
|
||||
dev = [
|
||||
"coverage==7.12.0",
|
||||
"django-coverage-plugin==3.2.0",
|
||||
"django-debug-toolbar==6.1.0",
|
||||
"django-extensions==4.1",
|
||||
"django-stubs[compatible-mypy]==5.2.7",
|
||||
"djangorestframework-stubs==3.16.5",
|
||||
"djlint==1.36.4",
|
||||
"factory-boy==3.3.2",
|
||||
"ipdb==0.13.13",
|
||||
"mypy==1.18.2",
|
||||
"pre-commit==4.5.0",
|
||||
"psycopg[c]==3.2.13",
|
||||
"pytest==9.0.1",
|
||||
"pytest-django==4.11.1",
|
||||
"pytest-sugar==1.1.1",
|
||||
"ruff==0.14.6",
|
||||
"sphinx==8.2.3",
|
||||
"sphinx-autobuild==2025.8.25",
|
||||
"watchfiles==1.1.1",
|
||||
"werkzeug[watchdog]==3.1.3",
|
||||
]
|
||||
|
||||
[project]
|
||||
name = "smoothschedule"
|
||||
version = "0.1.0"
|
||||
description = "Multi-Tenant SaaS Resource Orchestration Platform"
|
||||
readme = "README.md"
|
||||
|
||||
license = { text = "MIT" }
|
||||
authors = [
|
||||
{ name = "Smooth Schedule Team", email = "admin@smoothschedule.com" },
|
||||
]
|
||||
requires-python = "==3.13.*"
|
||||
dependencies = [
|
||||
"argon2-cffi==25.1.0",
|
||||
"celery==5.5.3",
|
||||
"crispy-bootstrap5==2025.6",
|
||||
"django==5.2.8",
|
||||
"django-allauth[mfa]==65.13.1",
|
||||
"django-anymail[mailgun]==13.1",
|
||||
"django-celery-beat==2.8.1",
|
||||
"django-cors-headers==4.9.0",
|
||||
"django-crispy-forms==2.5",
|
||||
"django-environ==0.12.0",
|
||||
"django-hijack>=3.4",
|
||||
"django-model-utils==5.0.0",
|
||||
"django-redis==6.0.0",
|
||||
"django-storages[s3]==1.14.6",
|
||||
"django-tenants>=3.6",
|
||||
"djangorestframework==3.16.1",
|
||||
"drf-spectacular==0.29.0",
|
||||
"flower==2.0.1",
|
||||
"gunicorn==23.0.0",
|
||||
"hiredis==3.3.0",
|
||||
"pillow==12.0.0",
|
||||
"psycopg[c]==3.2.13",
|
||||
"python-slugify==8.0.4",
|
||||
"redis==7.1.0",
|
||||
"sentry-sdk==2.46.0",
|
||||
"whitenoise==6.11.0",
|
||||
"stripe>=7.0.0",
|
||||
]
|
||||
Reference in New Issue
Block a user