Django-портал для внутренних новостей, блога и каталога сотрудников.
- Django (latest stable in
5.x) - Django REST Framework
- PostgreSQL
- Docker Compose
cp .env.example .envdocker compose up --build- Open:
http://localhost:8000 - API root:
http://localhost:8000/api/
python3 -m venv .venv && source .venv/bin/activatepip install -r requirements.txtpython manage.py migratepython manage.py runserver
GET/POST /api/employees/GET/POST /api/posts/
POST /api/auth/login/(username/password -> token)GET /api/auth/me/(Bearer token required)
GET /api/employees/— paginated catalog withcount/next/previous/page/page_size/resultsGET /api/employees/?q=<text>— search by full name, position or emailGET /api/employees/?department=<name>— filter by departmentGET /api/employees/?q=<text>&department=<name>&page=2&page_size=10— combined filters + paginationGET /api/employees/<id>/quick-contact/— быстрый контакт (phone/email/messenger + приоритетный CTA link)- API возвращает только активных сотрудников (
is_active=true) для клиентского каталога.
Example request:
curl -H "Authorization: Token <TOKEN>" \
"http://localhost:8000/api/employees/?q=иванов&department=hr&page=1&page_size=10"Example response envelope:
{
"count": 42,
"next": "http://localhost:8000/api/employees/?page=2&page_size=10",
"previous": null,
"page": 1,
"page_size": 10,
"results": [
{
"id": 1,
"full_name": "Иван Иванов",
"department": "HR"
}
]
}Quick-contact example:
{
"id": 1,
"full_name": "Иван Иванов",
"quick_contact": {
"phone": "+79990001122",
"email": "ivanov@example.com",
"messenger": "@ivanov",
"messenger_link": "https://t.me/ivanov"
},
"cta": {
"type": "phone",
"preferred_channel": "phone",
"link": "tel:+79990001122"
}
}- Filter by title (
q) and author (author) - Pagination for news feed
GET /api/posts/?q=<title>GET /api/posts/?author=<author>GET /api/posts/?is_published=true|false
GET /api/health/-> service metadata + DB status.
- File:
logs/audit.log(JSONL) - Trigger: POST/PUT/PATCH/DELETE on
/api/* - Fields:
ts,method,path,status,user
# 1) build + run
cp .env.example .env
docker compose up --build -d
# 2) apply migrations
docker compose exec web python manage.py migrate
# 3) create demo user for token auth (if missing)
docker compose exec web python manage.py shell -c "from django.contrib.auth import get_user_model; U=get_user_model(); U.objects.filter(username='qa').exists() or U.objects.create_user('qa', password='qa123456')"
# 4) get token
TOKEN=$(curl -s -X POST http://localhost:8000/api/auth/login/ \
-H 'Content-Type: application/json' \
-d '{"username":"qa","password":"qa123456"}' | python3 -c 'import sys,json; print(json.load(sys.stdin)["token"])')
# 5) smoke checks
curl -s "http://localhost:8000/api/employees/?q=ИВАН&department=РАЗРАБОТ&page=1&page_size=5" \
-H "Authorization: Token $TOKEN"
curl -s "http://localhost:8000/api/employees/1/quick-contact/" \
-H "Authorization: Token $TOKEN"
# 6) teardown
docker compose down