Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 54 additions & 26 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,42 +1,70 @@
__pycache__
# Python
__pycache__/
*.py[cod]
*.pyo
*.pyd
*.egg-info
*.so
*.egg
*.whl
*.egg-info/
dist/
build/

# Environnements virtuels
.venv/
venv/
env/
ENV/

# Variables d'environnement — ne jamais commiter
.env
!.env.example
*.env
*.venv
!*.env.example

# Secrets
secret*
*.key
*.pem

# Bases de données locales
*.db
*.sqlite3

# Logs
*.log
*.DS_Store
*.coverage
*.mypy_cache
*.pytest_cache
*.tox
*.coverage.*
*.hypothesis
*.coverage.*
*.coverage.*
*.coverage.*
*.coverage.*
logs/

# IDEs
.vscode/
.idea/
*.iml
*.sublime-project
*.sublime-workspace

# OS
.DS_Store
Thumbs.db
desktop.ini

# Tests et données mock
.coverage
.pytest_cache/
.mypy_cache/
.tox/
htmlcov/
coverage.xml
mock*
fake*
fake_data.py
QRCODE
env
test.py
pycontg25
*cache*
test*

# Assets générés
QRCODE/
*.bak
*.tmp
*.swp
*.swo
*.idea
.vscode
*.iml
test.py
test*
*.sublime-project
db.sqlite3
*.sql
.gstack/
pycontg25/
6 changes: 3 additions & 3 deletions app/database/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

load_dotenv()

url: str = os.environ.get("SUPABASE_URL")
key: str = os.environ.get("SUPABASE_KEY")
url: str = os.environ.get("SUPABASE_URL", "")
key: str = os.environ.get("SUPABASE_KEY", "")

supabase: Client = create_client(url, key)
supabase: Client | None = create_client(url, key) if url and key else None
20 changes: 10 additions & 10 deletions app/routers/router_2025.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,18 +60,18 @@
2025, 6, 30, 16).strftime("%d %B %Y at %H:%M UTC")


API_ROOT = os.getenv("API_ROOT", "http://127.0.0.1:8000/api")
speakers_list = requests.get(f"{API_ROOT}/speakers")
if speakers_list.status_code == 200:
speakers_list = speakers_list.json()
else:
speakers_list = []
API_ROOT = os.getenv("API_ROOT", "")

try:
_r = requests.get(f"{API_ROOT}/speakers", timeout=5) if API_ROOT else None
speakers_list = _r.json() if _r and _r.status_code == 200 else []
except Exception:
speakers_list = []

paidsponsors = requests.get(f"{API_ROOT}/sponsors")
if paidsponsors.status_code == 200:
paidsponsors = paidsponsors.json()
else:
try:
_r = requests.get(f"{API_ROOT}/sponsors", timeout=5) if API_ROOT else None
paidsponsors = _r.json() if _r and _r.status_code == 200 else []
except Exception:
paidsponsors = []


Expand Down
29 changes: 29 additions & 0 deletions app/routers/router_2026.py
Original file line number Diff line number Diff line change
Expand Up @@ -1474,6 +1474,35 @@ def shop(request: Request):
pass


async def _fetch_job_offers() -> list[dict]:
event_code = getattr(settings, "python_togo_event_code", None)
if not event_code:
return []
headers = {"Authorization": f"Bearer {settings.python_togo_api_key}"}
url = _build_api_url(f"/job-offers/list/{event_code}")
try:
async with httpx.AsyncClient(timeout=settings.python_togo_api_timeout_seconds) as client:
response = await client.get(url, headers=headers)
if response.status_code < 400:
return _extract_partner_rows(response.json())
except Exception:
return []
return []


@router.get("/jobs")
async def jobs(request: Request):
job_offers = await _fetch_job_offers()
return await _render_page_with_event(
request=request,
name="2026_jobs.html",
active_page="jobs",
page_css="jobs.css",
page_title="PyCon Togo 2026 — Job Board",
extra_context={"job_offers": job_offers},
)


@router.get("/30daysofpython")
def _30daysofpython(request: Request):
return RedirectResponse(url="https://fata.app/challenge/pycon-togo-2026", status_code=302)
Expand Down
Loading