Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
0b5f821
А1: Реестр схем: загрузка XSD, парсинг метаданных, первичный UI
knoff Aug 21, 2025
25ffe68
А1: Правки Actions
knoff Aug 21, 2025
68d1a22
А1: еще правим Actions
knoff Aug 21, 2025
3388975
A1: Пробуем заменить minio на другой образ
knoff Aug 21, 2025
1fda77c
Alembic logging: restore root logger and prevent duplicates (propagat…
knoff Aug 21, 2025
7472aee
Локальные тесты проходят
knoff Aug 21, 2025
d9884ea
Правим настройки для CI
knoff Aug 21, 2025
0fb3a5a
Потеряли запуск
knoff Aug 21, 2025
ddca966
Изменили комадну запуска alembic из-за смены окружения
knoff Aug 21, 2025
280a446
Боремся с коллизией имен alembic
knoff Aug 21, 2025
531ff54
Настраиваем парсинг данных при загрузке схемы
knoff Aug 22, 2025
9794b6d
A1: UI загрузки XSD + извлечение метаданных и классификация
knoff Aug 22, 2025
6ec8958
A1: поддержка справочника типов в БД, корректная классификация и тесты
knoff Aug 22, 2025
6f0ccc0
A1: Закрываем Issues A1-7 и A1-8. Seed базовых типов + некоторая поли…
knoff Aug 24, 2025
07a8bf7
A1: Закрываем Issues A1-7 и A1-8. Seed базовых типов + некоторая поли…
knoff Aug 24, 2025
756f9dc
A1-9: add frontend lockfile
knoff Aug 24, 2025
1ecbc3d
A1-9: add @vitejs/plugin-react dev dependency
knoff Aug 24, 2025
3c8f7e0
A1-9: Собрана базовая работа с React. Промежуточный коммит.
knoff Aug 25, 2025
54c893c
A1-9: 0004 migration fix
knoff Aug 25, 2025
811f1aa
А1-9: Список схем полностью переведен на React.
knoff Aug 26, 2025
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
63 changes: 63 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
name: CI

on:
push:
branches: [ master, main ]
pull_request:
branches: [ master, main ]
jobs:
test:
runs-on: ubuntu-latest

services:
postgres:
image: postgres:16
env:
POSTGRES_USER: xmlsvc
POSTGRES_PASSWORD: xmlsvc
POSTGRES_DB: xmlsvc
ports: ["5432:5432"]
options: >-
--health-cmd="pg_isready -U xmlsvc"
--health-interval=10s
--health-timeout=5s
--health-retries=5

minio:
image: bitnami/minio:latest
ports: ["9000:9000"]
env:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
MINIO_DEFAULT_BUCKETS: xmlsvc
options: >-
--health-cmd="curl -fsS http://localhost:9000/minio/health/ready || exit 1"
--health-interval=5s
--health-timeout=5s
--health-retries=30

env:
PYTHONPATH: ${{ github.workspace }} # <— ключевой фикс
DATABASE_URL: postgresql+psycopg://xmlsvc:xmlsvc@localhost:5432/xmlsvc
S3_ENDPOINT: http://localhost:9000
S3_BUCKET: xmlsvc
S3_ACCESS_KEY: minioadmin
S3_SECRET_KEY: minioadmin

steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.11"

- name: Install deps
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install pytest

- name: Alembic upgrade
run: python -m alembic upgrade head

- name: Run tests
run: pytest -q
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ venv/
dist/
*.egg-info/

# frontend build artifacts
frontend/node_modules/
frontend/dist/

# Local data
data/
uploads/
Expand Down
5 changes: 5 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"python.defaultInterpreterPath": "${workspaceFolder}\\.venv\\Scripts\\python.exe",
"python.analysis.extraPaths": ["app"],
"python.analysis.typeCheckingMode": "basic"
}
37 changes: 36 additions & 1 deletion .vscode/tasks.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,41 @@
"group": "build",
"presentation": { "reveal": "always", "panel": "dedicated" },
"problemMatcher": []
}
},
{
"label": "UI Build (vite prod)",
"type": "shell",
"options": { "cwd": "${workspaceFolder}/frontend" },
"command": "npm run build",
"group": "build",
"presentation": { "reveal": "always", "panel": "dedicated" },
"problemMatcher": []
},
{
"label": "UI Deploy to backend static",
"type": "shell",
"command": "powershell -NoProfile -ExecutionPolicy Bypass -Command \"mkdir ${workspaceFolder}\\app\\static -ea 0 | Out-Null; robocopy ${workspaceFolder}\\frontend\\dist ${workspaceFolder}\\app\\static /MIR | Out-Null; docker compose restart app\"",
"group": "build",
"presentation": { "reveal": "always", "panel": "dedicated" },
"problemMatcher": []
},
{
"label": "Dev: Build+Deploy UI",
"type": "shell",
"command": "echo Building and deploying UI to backend static...",
"dependsOn": ["UI Build (vite prod)", "UI Deploy to backend static"],
"dependsOrder": "sequence",
"group": "build",
"presentation": { "reveal": "always", "panel": "dedicated" },
"problemMatcher": []
},
{
"label": "Pytest (container)",
"type": "shell",
"command": "docker compose exec -e DATABASE_URL=postgresql+psycopg://xmlsvc:xmlsvc@postgres:5432/xmlsvc -e S3_ENDPOINT=http://minio:9000 -e S3_BUCKET=xmlsvc -e S3_ACCESS_KEY=minioadmin -e S3_SECRET_KEY=minioadmin app pytest -q",
"group": "test",
"presentation": { "reveal": "always", "panel": "dedicated" },
"problemMatcher": []
},
]
}
30 changes: 30 additions & 0 deletions CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@

## 📄 CODE_OF_CONDUCT.md

# Кодекс поведения участников

Мы придерживаемся [Contributor Covenant](https://www.contributor-covenant.org/) версии 2.1.

## Наши обязательства

Мы, как участники и мейнтейнеры, обязуемся создать дружелюбную и безопасную среду для всех, независимо от возраста, пола, опыта, национальности, религии или политических взглядов.

## Ожидаемое поведение

- Демонстрировать уважение к другим участникам
- Принимать конструктивную критику
- Использовать корректный и профессиональный язык
- Поддерживать атмосферу сотрудничества

## Недопустимое поведение

- Оскорбления, унижения, личные нападки
- Дискриминация и домогательства
- Публичное или личное преследование
- Публикация личной информации без согласия

## Применение

Нарушения кодекса поведения могут привести к предупреждению или удалению из сообщества.

Контакты для вопросов и жалоб: [открыть issue](https://github.com/knoff/construction_xml/issues) или связаться с мейнтейнером напрямую.
55 changes: 55 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# Вклад в проект

Спасибо, что хотите помочь развитию **Construction XML Service**!

## Как начать

1. Форкните репозиторий и создайте ветку для вашей задачи:
```bash
git checkout -b feature/my-feature
```

2. Поднимите окружение локально:

```bash
docker compose up -d
```

Сервис поднимется вместе с PostgreSQL и MinIO.

3. Выполните миграции:

```bash
docker compose exec app alembic upgrade head
```

4. Запустите тесты:

```bash
docker compose exec app pytest -q
```

## Стиль кода

* Python 3.11, придерживаемся PEP8.
* Используем `black` для форматирования.
* Типизация: `mypy` и аннотации обязательны.
* Коммиты оформляем в стиле:

```
A2-1: Краткое описание задачи
```

## Pull Request

* Перед PR убедитесь, что тесты проходят (`pytest`) и код отформатирован.
* PR должен ссылаться на соответствующий Issue или Milestone.
* В PR описать:

* Что сделано
* Как протестировать
* Замечания или TODO

## Вопросы

Если есть вопросы — используйте [Issues](https://github.com/knoff/construction_xml/issues).
16 changes: 15 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,14 @@
# Minimal Dockerfile for the FastAPI app (Windows-friendly build)
### --- Stage 1: build frontend (React/Vite) ---
FROM node:20-alpine AS frontend-build
WORKDIR /frontend
# Copy only frontend to leverage Docker cache
COPY frontend/package.json frontend/package-lock.json ./
RUN npm ci --no-audit --no-fund
COPY frontend/ ./
# Build production assets (bundled, no CDN)
RUN npm run build

### --- Stage 2: backend (FastAPI) ---
FROM python:3.11-slim

# Avoid interactive tzdata prompts, speed up pip
Expand All @@ -17,5 +27,9 @@ RUN pip install -r requirements.txt
# Copy app sources
COPY app ./app

# Copy built frontend
# Result of Vite build goes to /frontend/dist; we place it under app/static
COPY --from=frontend-build /frontend/dist /app/app/static

EXPOSE 8000
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
16 changes: 16 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0)

Это произведение лицензируется на условиях лицензии Creative Commons
«Attribution-NonCommercial» (Атрибуция — Некоммерческое использование) версии 4.0.

Вы можете:
- Делиться — копировать и распространять материал на любом носителе и в любом формате.
- Адаптировать — ремикшировать, трансформировать и брать за основу этот материал.

На следующих условиях:
- Атрибуция — необходимо указывать авторство, предоставлять ссылку на лицензию и
указывать, были ли внесены изменения.
- Некоммерческое использование — запрещено использовать материал в коммерческих целях.

Для получения полного текста лицензии посетите:
https://creativecommons.org/licenses/by-nc/4.0/
81 changes: 43 additions & 38 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,38 +1,43 @@
# Минстрой XML Service (Python/FastAPI) — MVP-скелет

**Назначение**: сервис для формирования и увязки документов (Задание, Пояснительная записка и др.) на базе **CDM** (канонической модели), с загрузкой правил, валидациями и работой с файлами.

## Быстрый старт (локально)

```bash
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reload
```

Откройте: http://127.0.0.1:8000/docs

## Что уже есть
- FastAPI-приложение, модульные роутеры.
- **CDM** (минимальный фрагмент) и простое создание черновиков документов.
- Загрузка файлов с расчётом **SHA-256** и контролем размера (порог задаётся в env).
- Загрузка правил-хэлперов (YAML), хранение их в файловой системе, базовая проверка структуры.
- Заготовки для: реестра XSD, печатных шаблонов, верификации откреплённых подписей.

## Структура
```
app/
api/routes/ # эндпоинты
core/ # конфиг, utils
models/ # CDM-модели
services/ # логика: файлы, правила, подписи, схемы
templates/ # шаблоны печати
rules/ # примеры правил (YAML)
tests/
```

## Дальше
- Подключить реальные XSD, автогенерацию JSON Schema форм.
- Реализовать движок правил (JSONLogic) и кросс-док проверки.
- Добавить генерацию PDF/DOCX из Jinja2/docxtpl.
- Подключить верификацию .sig и (опционально) подписание.
# Construction XML Service

Веб-сервис для работы с нормативными XML-схемами Минстроя (XSD/XSL)
при проектировании и экспертизе объектов недвижимости.
Система разрабатывается для использования любыми участниками процесса проектирования, экспертизы и строительства объектов недвижимости.

## Возможности
Суть проекта в реализации сквозного заполнения документов с использованием ранее внесенных данных с формированием единого пространства данных для объекта недвижимости.

Проект основывается на опубликованных схемах XSD Минстроя для различных форм документов.
Фактически мы повторяем функционал отдельных сервисов по заполнению отдельных документов, но в общем интерфейсе, едином пространстве и, как следствие, с возможностью переиспользования данных.
В процессе заполнения любого документа формируется предстваление объекта CDM данные из которого подтягиваются в другие документы по этому же объекту.
В системе используются дополнительные средства контроля данных, проверки и хелперы, которые позволяют сократить число операций, необхедимых для получения полного комплекта документов по объекту, выявлять ошибки на более ранних этапах и проводить перекреную проверку данных в разных документах.

## Milestones
Разработка ведётся по [Milestones](https://github.com/knoff/construction_xml/milestones):

- **A1** — Реестр XSD-схем и базовый интерфейс.
- **A2** — Генерация форм из XSD.
- **A3** — Правила и хелперы (логика сверх XSD).
- **A4** — Шаблоны печатных форм.
- **B1–B5** — Работа с файлами, ЭП, интеграции, доступы.

## Технологии
- Backend: Python 3.11, FastAPI
- ORM: SQLAlchemy, Alembic
- Хранение файлов: MinIO (S3-совместимый)
- DB: PostgreSQL
- CI/CD: GitHub Actions
- Docker Compose для локальной разработки

## Ограничение ответственности
Система находится в активной разработке, авторы не несут ответственности за возможные ошибки в формируемых документах и их последствия.
Система не передает вводимые данные на внешние сервера и в сторонние сервисы, однако авторы не несут ответственность за возможные нарушения Закона о защите персональных данных при использовании системы. Ответственность за выполнение требований законодательства лежит на операторе персональных данных, осуществляющем их обработку в процессе использования системы.
Напоминаем всем участникам процесса, что само формирование документов на основе схем Минстроя является обработкой персональных данных и требует соблюдения требований законодательства.

## Участие
Pull-requests приветствуются.
Для предложений и багов используйте [Issues](https://github.com/knoff/construction_xml/issues).

## Лицензия
Проект распространяется под лицензией [CC-BY-NC 4.0](LICENSE).
⚠️ **Коммерческое использование запрещено.**
Loading
Loading