{% extends "base.html" %} {% import "_project_pulse_macros.html" as pp %} {% block title %}{% if d.project %}{{ d.project.name }}{% else %}Проект{% endif %} — Проектный пульт{% endblock %} {% block page_title %}Проектный пульт · проект{% endblock %} {% block head %} {% endblock %} {% block content %} ← ко всем проектам {% if d.error == 'not_found' %}
Проект «{{ slug }}» не найден.
{% elif d.error %}
{{ d.error }}
{% elif d.project %} {% set p = d.project %}

{{ p.name }}

{{ pp.score_badge(p.score, p.reason) }} {% if csrf and not write_blocked and p.status not in ('done', 'archived') %} {% endif %}
{{ pp.status_chip(p.status, p.status_ru) }} {{ pp.money_chip(p.money) }} {{ pp.speed_chip(p.speed) }} {{ p.business_ru }} {% if p.type %}{{ p.type }}{% endif %} {% if p.board %}{{ p.board }}{% endif %} {% if not p.has_rating %}оценка по умолчанию{% endif %}
{% if p.repo_path or p.plans_home or p.prod_url %}
Где работать {% if p.repo_path %}
код {{ p.repo_path }} {% if p.repo_branch %}{{ p.repo_branch }}{% endif %}
{% endif %} {% if p.plans_home %}
планы {{ p.plans_home }}
{% endif %} {% if p.prod_url %}
прод {{ p.prod_url }}
{% endif %}
{% endif %}
{{ pp.progress_bar(p.blocks_done, p.blocks_total, p.blocks_progress, 'is-done' if p.status=='done' else '') }} блоки
{# Чек методологии — идея/архитектура/дизайн/безопасность по фиче (что нужно и что сделано). #} {% if p.methodology %}
{% for it in p.methodology %}{{ pp.methodology_chip(it) }}{% endfor %} {% set _miss = p.methodology | selectattr('state', 'equalto', 'todo') | list | length %} {% if _miss %}доделать: {{ _miss }}{% endif %}
{% for it in p.methodology %}
{{ it.label }} {% if it.is_sec %} {{ it.state_ru }}{% if it.level_ru %} — зона: {{ it.level_ru }}{% if it.sec_total %} · {{ it.sec_done }}/{{ it.sec_total }} пунктов{% endif %}{% if it.sec_reason %} · {{ it.sec_reason }}{% endif %}{% elif it.note %} — {{ it.note }}{% endif %} {% if it.sec_todo %}доделать: {{ it.sec_todo | join(', ') }}{% endif %} {% if it.hint %}{{ it.hint }}{% endif %} полный чек-лист → {% else %} {{ it.state_ru }}{% if it.note %} — {{ it.note }}{% endif %} {% if it.hint %}{{ it.hint }}{% endif %} {% endif %}
{% endfor %}
{% else %}

методология не размечена

{% endif %} {% if p.updated %}

обновлено {{ p.updated }}

{% endif %} {% if csrf and not write_blocked %} {% if p.status not in ('done', 'archived') %}
{% else %}
{% endif %} {% endif %}
{# ===== Карта проекта (X-Mind, вариант А): проект → планы → фазы. Двойной спойлер: ===== #} {# вся карта свёрнута по умолчанию (внешний), готовые/архивные планы свёрнуты строкой (внутренний). #} {% if p.map_plans %}
Карта проекта {% if p.blocks_total %}блоки {{ p.blocks_done }}/{{ p.blocks_total }}{% endif %} планов {{ p.map_plans|length }}
{{ pp.tree_mark(p.status) }} {{ p.name }} {% if p.blocks_total %}{{ p.blocks_done }}/{{ p.blocks_total }}{% endif %}
{% for pl in p.map_plans %}
{% if pl.missing %} {{ pp.tree_mark('') }}{{ pl.title }}нет файла {% elif pl.status in ['done', 'archived'] %}
{{ pp.tree_mark(pl.status) }} {{ pl.title }} {{ pl.status_ru }} {% if pl.phase_total %}{{ pl.phase_done }}/{{ pl.phase_total }}{% endif %}
{% if pl.summary %}
{{ pl.summary }}
{% endif %} Открыть план → {% if pl.phases %}
{% for ph in pl.phases %}
{{ pp.tree_mark(ph.status) }} {{ pp.phase_label(ph) }}
{% endfor %}
{% endif %}
{% else %} {{ pp.tree_mark(pl.status) }} {{ pl.title }} {% if pl.phase_total %}{{ pl.phase_done }}/{{ pl.phase_total }}{% endif %} {% if pl.phases %}
{% for ph in pl.phases %}
{{ pp.tree_mark(ph.status) }} {{ pp.phase_label(ph) }}
{% endfor %}
{% endif %} {% endif %}
{% endfor %}
готово в работе впереди архив
{% endif %} {# ===== Планы проекта (готовые/архивные скрыты по умолчанию) ===== #}
Планы проекта · {{ p.plans|length }}{% if d.hidden_done or d.hidden_archived %} из {{ p.plan_count }}{% endif %}
{% if d.hidden_done or d.hidden_archived or d.show_done or d.show_archived %}
{% if d.hidden_done or d.show_done %} {% if d.show_done %}Скрыть готовые{% else %}👁 Готовые ({{ d.hidden_done }}){% endif %} {% endif %} {% if d.hidden_archived or d.show_archived %} {% if d.show_archived %}Скрыть архив{% else %}📦 Архив ({{ d.hidden_archived }}){% endif %} {% endif %}
{% endif %} {% if p.plans %} {% for pl in p.plans %} {% if pl.missing %}
{{ pl.title }}нет файла
{% else %}
{{ pl.title }} {{ pl.date }}
{% if pl.owner_id and p.owner_id and pl.owner_id != p.owner_id %} {{ pl.business }} {% endif %} {{ pp.status_chip(pl.status, pl.status_ru) }} {% if pl.phase_total and pl.status not in ['done','archived'] %}фазы {{ pl.phase_done }}/{{ pl.phase_total }}{% endif %} {% if pl.profit_badge %}{{ pp.profit_badge(pl.profit_badge, pl.profit_reason, pl.profit_is_manual) }}{% endif %}
{% if pl.summary %}
{{ pl.summary }}
{% endif %}
{% endif %} {% endfor %} {% else %}

У проекта пока нет привязанных планов (поле links: в карточке).

{% endif %}
{# ===== Документы проекта (доки из tools/code) ===== #} {% if p.docs %}
Документы · {{ p.docs|length }}
{% for doc in p.docs %}
{{ doc.title }} {{ doc.file }}
{% endfor %}
{% endif %} {# ===== Идеи проекта (из инбокса бота) ===== #} {% if p.ideas %}
💡 Идеи · {{ p.ideas|length }}
{% for i in p.ideas %} {{ i.title }} {% if i.code %}{{ i.code }}{% endif %} {% endfor %}
{% endif %} {# ===== Ресурсы (код / папки tools) ===== #} {% if p.resources %}
Код и ресурсы
{% for r in p.resources %} {% if r.kind == 'url' %} ↗ {{ r.path }} {% else %} {% if r.kind == 'dir' %}📁{% else %}📎{% endif %} {{ r.path }} {% endif %} {% endfor %}
{% endif %} {# ===== Карточка проекта (текст) ===== #} {% if p.about_html %}
Что это и зачем
{{ p.about_html|safe }}
{% endif %} {% if p.where_html %}
Где мы сейчас
{{ p.where_html|safe }}
{% endif %} {% if p.blocks_html %}
Блоки
{{ p.blocks_html|safe }}
{% endif %} {% if p.backlog_html %}
Бэклог / дальше
{{ p.backlog_html|safe }}
{% endif %} {% if p.depends_on %}
Зависит от
{% for dep in p.depends_on %}{{ dep }}{% endfor %}
{% endif %} {% if csrf and not write_blocked and p.status not in ('done', 'archived') %} {% endif %} {% else %}
Нет данных по проекту.
{% endif %} {% endblock %} {% block scripts %} {% endblock %}