SanaLab
Django-платформа: представитель бизнеса описывает задачу (название, описание, потребность, ожидаемый результат, контакт, формат взаимодействия)…
О проекте
Команда: SanaLab
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Прототип
Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд
Суть
Django-платформа: представитель бизнеса описывает задачу (название, описание, потребность, ожидаемый результат, контакт, формат взаимодействия), подтверждает карточку и получает рейтинг полноты 0–100. Для студентов есть отдельные аккаунты и рекомендации.
Как устроено
Регистрация с ролями business и student, модель BusinessRequest со статусом, подтверждением и ревизиями. После каждого сохранения рейтинг полноты пересчитывается с расшифровкой баллов и списком недостающих сведений, а карточка возвращается в черновик до повторного подтверждения. Судя по README, веса рейтинга заданы правилами, LLM не упоминается.
Ключевые решения
- rule-based completeness scoring
- role-based accounts
- draft/confirm workflow
Стек
Python · Django 6 · SQLite
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-b2505c12-sanalab.
README
README.mdSanaLab
hack-b2505c12-sanalab — репозиторий команды SanaLab для хакатона.
По техническому заданию проект предназначен для описания задач бизнеса: пользователь формулирует потребность, сохраняет редактируемую карточку, подтверждает сведения и видит оценку полноты задачи. В обсуждённой структуре предусмотрены аккаунты представителей бизнеса и студентов.
О версии документа. Зависимости и точка запуска проверены по переданным корневым файлам; структура данных — по схемам двух резервных баз SQLite. Разделы о функциях и маршрутах основаны на ТЗ и коде из обсуждения проекта. Актуальные папки
accounts,backend,frontend,configи рабочая базаdb.sqlite3в последнюю загрузку не вошли, поэтому наличие всех функций в текущем репозитории и успешный запуск не подтверждены.
Функциональность по ТЗ
| Направление | Требование |
|---|---|
| Аккаунты | Регистрация, вход и личный кабинет для ролей «Представитель бизнеса» и «Студент». |
| Создание задачи | Свободный ввод названия, описания, потребности, ожидаемого результата, контакта и формата взаимодействия. |
| Карточка задачи | Просмотр сохранённых сведений и редактирование существующей записи. |
| Ручное подтверждение | Отдельное действие подтверждения после проверки введённых данных. |
| Оценивание | Рейтинг полноты от 0 до 100, расшифровка баллов и список недостающих сведений. |
| Пересчёт | Обновление оценки после редактирования и сохранения задачи. |
В ранее обсуждённом сценарии подтверждение выполняет автор задачи, а не модератор. Сохранение изменений возвращает карточку в черновик и требует повторного подтверждения. Реализацию этих переходов необходимо сверять с текущими обработчиками.
Данные задачи
| Поле | Имя в модели из обсуждения | Содержание |
|---|---|---|
| Название | title | Краткое название задачи. |
| Описание | description | Текущая ситуация и контекст проблемы. |
| Потребность | need | Что необходимо для решения задачи. |
| Ожидаемый результат | expected_result | Желаемые изменения и признаки достижения результата. |
| Контакт | contact | Удобный способ связи, указанный свободным текстом. |
| Формат взаимодействия | interaction_format | Предпочтительный способ совместной работы. |
Все шесть столбцов присутствуют в таблице backend_businessrequest резервной базы db.before_request_features.sqlite3. Это подтверждает структуру снимка, но не правила проверки формы и не состояние рабочей базы.
Рейтинг полноты
ТЗ предусматривает общую оценку 0–100, пояснение начисленных баллов и рекомендации, какие сведения повысят рейтинг. После сохранения изменений пользователь должен видеть актуальную оценку.
Конкретные веса и пороги исходным ТЗ не заданы. В подготовленном ранее дополнении расчёт был вынесен в backend/task_rating.py, а вывод — в шаблоны карточки и списка. В последнюю загрузку этот модуль не вошёл: действующие критерии необходимо проверять в коде репозитория.
Рейтинг полноты не следует представлять как оценку достоверности, коммерческой ценности или выполнимости задачи. Он также не заменяет ручное подтверждение.
Структура проекта
Ниже объединены корневые файлы из последней загрузки и структура приложений, ранее показанная в обсуждении. Дерево не является полным перечнем файлов текущего репозитория.
hack-b2505c12-sanalab/
├── accounts/ # Аккаунты, вход и личные кабинеты
│ ├── migrations/
│ ├── templates/
│ │ └── accounts/
│ ├── models.py
│ ├── urls.py
│ └── views.py
├── backend/ # Модели и логика задач
│ ├── migrations/
│ └── models.py
├── config/ # Настройки и корневые маршруты
│ ├── settings.py
│ └── urls.py
├── frontend/ # Формы, представления и страницы
│ ├── static/
│ │ └── frontend/
│ ├── templates/
│ │ └── frontend/
│ ├── forms.py
│ ├── urls.py
│ └── views.py
├── .gitignore
├── db.sqlite3 # Рабочая база; в загрузку не вошла
├── db.before_form_tz.sqlite3 # Резервный снимок базы
├── db.before_request_features.sqlite3 # Резервный снимок базы
├── manage.py
├── requirements.txt
└── README.md
В manage.py по умолчанию установлен модуль настроек config.settings. Команды проекта выполняются из каталога, содержащего manage.py.
Зависимости
Версии перенесены из requirements.txt без изменений:
asgiref==3.12.1
Django==6.0.6
sqlparse==0.6.0
tzdata==2026.4
Версия Python в переданных корневых файлах не зафиксирована. Согласно документации Django 6.0, поддерживаются ветки Python 3.12, 3.13 и 3.14; это требование фреймворка, а не подтверждённая матрица тестирования SanaLab. Источники общих инструкций приведены в конце документа.
Резервные базы имеют формат SQLite. Фактическое подключение рабочей базы определяется настройкой DATABASES в config/settings.py, содержимое которой в последнюю загрузку не вошло.
Локальный запуск
Инструкция рассчитана на полный репозиторий с приложениями, настройками и миграциями. Одних приложенных корневых файлов недостаточно: отсутствие config/settings.py или кода приложений нельзя исправить установкой зависимостей.
Перед обновлением существующего проекта сохраните копию кода и рабочей базы. Не подменяйте db.sqlite3 одним из резервных снимков для обычного запуска.
1. Открыть корень проекта
Перейдите в уже скачанный или клонированный репозиторий:
cd hack-b2505c12-sanalab
python --version
Адрес репозитория в переданных файлах не указан, поэтому команда клонирования с предполагаемым URL здесь не приводится.
2. Создать и активировать окружение
При первом запуске:
python -m venv venv
Если рабочее окружение уже создано, достаточно его активировать. Выберите команду для своего терминала.
Windows — Git Bash:
source venv/Scripts/activate
Windows — CMD:
venv\Scripts\activate.bat
Windows — PowerShell:
.\venv\Scripts\Activate.ps1
Linux / macOS — Bash или Zsh:
source venv/bin/activate
На Linux/macOS при отсутствии команды python для создания окружения используйте python3 -m venv venv.
3. Установить зависимости
В активированном окружении:
python -m pip install -r requirements.txt
python -m django --version
После установки из приложенного файла ожидаемая версия Django — 6.0.6. Если установщик не находит одну из закреплённых версий, сначала проверьте версию Python, доступ к индексу пакетов и корректность командного окружения; не заменяйте зависимости произвольными версиями без согласования с командой.
4. Проверить проект и применить миграции
python manage.py check
python manage.py migrate
Выполняйте команды по очереди и исправляйте ошибку предыдущей до запуска следующей. При обычном развёртывании применяются миграции из репозитория. makemigrations нужен для изменений моделей, а не вместо отсутствующих исходников.
5. Запустить сервер разработки
python manage.py runserver
Откройте в браузере:
http://127.0.0.1:8000/
Остановка сервера — Ctrl + C. runserver предназначен для локальной разработки, а не для публичного размещения.
Страницы и маршруты
Адреса приведены по маршрутам из обсуждения. Они предполагают подключение frontend.urls к корню сайта и accounts.urls под префиксом accounts/; актуальный config/urls.py необходимо сверить с репозиторием.
| Адрес | Назначение |
|---|---|
/ | Главная страница. |
/request/ | Создание задачи. |
/requests/ | Список «Мои заявки» из дополнения к карточкам. |
/accounts/ | Выбор типа аккаунта. |
/accounts/business/register/ | Регистрация представителя бизнеса. |
/accounts/business/login/ | Вход представителя бизнеса. |
/accounts/business/ | Личный кабинет представителя бизнеса. |
/accounts/student/register/ | Регистрация студента. |
/accounts/student/login/ | Вход студента. |
/accounts/student/ | Личный кабинет студента. |
/accounts/logout/ | Выход; в присланной реализации используется POST-форма. |
В показанном accounts/urls.py личный кабинет имеет имя accounts:dashboard и принимает параметр role со значением business или student. Страницы входа и регистрации используют имена accounts:login и accounts:register.
Точные адреса отдельных карточек и их редактирования следует брать из текущего frontend/urls.py; в корневых файлах они не определены.
База данных и резервные копии
| Файл | Что подтверждает схема снимка |
|---|---|
db.before_form_tz.sqlite3 | Таблица backend_businessrequest содержит первоначальные поля: компанию, email, тип обращения, название, описание, ожидаемый результат и дату создания. |
db.before_request_features.sqlite3 | В таблице задач дополнительно присутствуют need, contact, interaction_format, status, confirmed_at, updated_at, owner_key и revision. Также присутствует accounts_accountprofile со столбцами role и user_id. |
Наличие столбцов статуса и подтверждения само по себе не доказывает работу соответствующих действий в интерфейсе. Снимки нельзя считать достоверным описанием последней версии моделей.
При подготовке документа проверялась структура таблиц, а не содержимое пользовательских записей. Для запуска проекта используйте актуальные миграции и выбранную рабочую базу; не удаляйте историю миграций для устранения ошибки формы или шаблона.
Что исключено из Git
В приложенном .gitignore указано:
__pycache__/
*.py[cod]
db.sqlite3
venv/
.venv/
В этом файле нет правила для db.before_*.sqlite3. Перед публикацией проекта проверьте, не попадут ли резервные базы в репозиторий.
Возможное дополнение, которое не применено автоматически:
*.sqlite3
*.sqlite3-*
.env
Правила .gitignore не прекращают отслеживание файлов, уже добавленных в Git. Изменения состава репозитория нужно проверять отдельно; публикация резервной базы может раскрыть содержащиеся в ней данные.
Проверка изменений
После внесения правок в полный проект:
python manage.py check
python manage.py test
Если установлен ранее подготовленный модуль оценки и существует backend/test_task_rating.py, отдельно доступны его тесты:
python -m unittest backend.test_task_rating -v
Присутствие этого тестового файла и результаты тестов в текущей версии не проверены по последней загрузке. Успешная системная проверка не заменяет проверку пользовательского сценария.
Проверка сценария по ТЗ
- Зарегистрировать тестовый аккаунт, выйти и повторно войти; проверить переход в кабинет своей роли.
- Создать задачу с шестью полями и убедиться, что после открытия карточки данные сохранены.
- Отредактировать карточку и проверить, что изменяется та же запись, а не создаётся новая.
- Проверить расшифровку рейтинга и рекомендации, затем изменить сведения и сравнить оценку после сохранения.
- Выполнить ручное подтверждение и отдельно проверить поведение статуса после редактирования.
Дополнительно следует проверить доступ к карточкам из другого аккаунта и другой сессии. В ранее подготовленном дополнении использовалась привязка к сессии; её нельзя автоматически считать привязкой к учётной записи после добавления авторизации.
Источники документации
Материалы проекта: исходный README.md, manage.py, requirements.txt, .gitignore, схемы двух приложенных резервных баз, а также ранее показанные структура проекта, accounts/urls.py, accounts/views.py и ТЗ. Предложенные ранее дополнения описаны отдельно от подтверждённого состава последней загрузки.
Общие инструкции по окружению и командам сверены с официальной документацией и не являются результатом запуска SanaLab:
| Источник | Адрес |
|---|---|
| Совместимость Python и Django 6.0 | https://docs.djangoproject.com/en/6.0/faq/install/ |
Окружение Python venv | https://docs.python.org/3/library/venv.html |
Команды manage.py | https://docs.djangoproject.com/en/6.0/ref/django-admin/ |
| Сервер разработки Django | https://docs.djangoproject.com/en/6.0/intro/tutorial01/ |
| Модели и миграции Django | https://docs.djangoproject.com/en/6.0/intro/tutorial02/ |
Правила .gitignore | https://git-scm.com/docs/gitignore |
Команда и лицензия
Команда — SanaLab. В исходном README проект обозначен как командный репозиторий для хакатона.
Состав команды и лицензия в переданных материалах не указаны. Этот документ не назначает проекту лицензию и не добавляет отсутствующие сведения об авторах.
Okesh Alikhan \ Timur Mukushev
Авторы коммитов
История коммитов
- 2026-09-23 17:50change READMEX-an-tati
- 2026-09-23 17:42add readmeTimurMukushev
- 2026-09-23 17:39add recommendations for studentsTimurMukushev
- 2026-09-23 17:14fix student registration errorTimurMukushev
- 2026-09-23 17:02Resolve merge conflicts and ignore generated filesTimurMukushev
- 2026-09-23 16:58main page recommendationsTimurMukushev
- 2026-09-23 16:57fix_cabX-an-tati
- 2026-09-23 16:39Merge branch 'main' of https://github.com/BAITC-Hacks/hack-b2505c12-sanalabX-an-tati
Все коммиты (20)
- 2026-09-23 16:39cabinet2X-an-tati
- 2026-09-23 16:22add profile pageTimurMukushev
- 2026-09-23 16:22add_authX-an-tati
- 2026-09-23 15:40change_request_page_againX-an-tati
- 2026-09-23 15:23add authentication and registration logicTimurMukushev
- 2026-09-23 15:10change_request_pageX-an-tati
- 2026-09-23 15:03change models file for backendTimurMukushev
- 2026-09-23 14:51add_request_pageX-an-tati
- 2026-09-23 14:29add model for business cardsTimurMukushev
- 2026-09-23 14:15main structureX-an-tati
- 2026-09-23 13:21add frontend appTimurMukushev
- 2026-09-23 13:09create project and appTimurMukushev
Структура репозитория (52 файлов)
.gitignore README.md accounts/__init__.py accounts/admin.py accounts/apps.py accounts/migrations/0001_initial.py accounts/migrations/__init__.py accounts/models.py accounts/templates/accounts/auth_base.html accounts/templates/accounts/choose_role.html accounts/templates/accounts/dashboard.html accounts/templates/accounts/login.html accounts/templates/accounts/register.html accounts/tests.py accounts/urls.py accounts/views.py backend/__init__.py backend/admin.py backend/apps.py backend/migrations/0001_initial.py backend/migrations/0002_businessrequest_contact_and_more.py backend/migrations/0003_alter_businessrequest_options_and_more.py backend/migrations/0004_businessrequest_owner.py backend/migrations/__init__.py backend/models.py backend/tests.py backend/views.py config/__init__.py config/asgi.py config/settings.py config/urls.py config/wsgi.py db.before_form_tz.sqlite3 db.before_request_features.sqlite3 frontend/__init__.py frontend/admin.py frontend/apps.py frontend/forms.py frontend/migrations/0001_initial.py frontend/migrations/__init__.py frontend/models.py frontend/templates/frontend/business_request.html frontend/templates/frontend/index.html frontend/templates/frontend/request_base.html frontend/templates/frontend/request_detail.html frontend/templates/frontend/request_list.html frontend/tests.py frontend/tests_requests.py frontend/urls.py frontend/views.py manage.py requirements.txt
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.