Трек «Метод Дегтярева»: концепция, презентация и рабочие листы

This commit is contained in:
apuc committed 2026-11-09 00:08:45 +03:00
commit 2c79f59064
28 files changed
+2999

No files matched your search

+484
View File
@@ -0,0 +1,484 @@
# -*- coding: utf-8 -*-
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.enum.shapes import MSO_SHAPE, MSO_CONNECTOR
OUT = 'Метод_Дегтярева_презентация.pptx'
BG = '121417'
CARD = '1C2024'
CARD2 = '23282D'
GREEN = '3FA37A'
GREEN_LIGHT = '7FD1AE'
ROSE = 'D94A6A'
WHITE = 'F5F5F5'
GRAY = '9AA0A6'
DARK_GRAY = '6B7075'
GOLD = 'C9A227'
def rgb(hexstr):
return RGBColor.from_string(hexstr)
def add_bg(slide, color=BG):
bg = slide.background
fill = bg.fill
fill.solid()
fill.fore_color.rgb = rgb(color)
def add_text(slide, x, y, w, h, text, font='Arial', size=12, color=WHITE,
bold=False, italic=False, align=PP_ALIGN.LEFT,
anchor=MSO_ANCHOR.TOP, line_spacing=1.0, space_after=0,
margins=(0, 0, 0, 0)):
tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
tf = tb.text_frame
tf.word_wrap = True
tf.margin_left = Inches(margins[0])
tf.margin_right = Inches(margins[1])
tf.margin_top = Inches(margins[2])
tf.margin_bottom = Inches(margins[3])
tf.vertical_anchor = anchor
lines = text.split('\n')
for i, line in enumerate(lines):
p = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
p.alignment = align
p.line_spacing = line_spacing
p.space_after = Pt(space_after)
r = p.add_run()
r.text = line
r.font.name = font
r.font.size = Pt(size)
r.font.bold = bold
r.font.italic = italic
r.font.color.rgb = rgb(color)
return tb
def add_rect(slide, x, y, w, h, fill=None, line=None, line_w=1.0,
shape=MSO_SHAPE.ROUNDED_RECTANGLE, radius=0.06):
shp = slide.shapes.add_shape(shape, Inches(x), Inches(y), Inches(w), Inches(h))
if fill:
shp.fill.solid()
shp.fill.fore_color.rgb = rgb(fill)
else:
shp.fill.background()
if line:
shp.line.color.rgb = rgb(line)
shp.line.width = Pt(line_w)
else:
shp.line.fill.background()
try:
shp.shadow.inherit = False
except Exception:
pass
if shape == MSO_SHAPE.ROUNDED_RECTANGLE:
try:
shp.adjustments[0] = radius
except Exception:
pass
return shp
def add_line(slide, x1, y1, x2, y2, color=DARK_GRAY, width=1.0):
conn = slide.shapes.add_connector(MSO_CONNECTOR.STRAIGHT,
Inches(x1), Inches(y1), Inches(x2), Inches(y2))
conn.line.color.rgb = rgb(color)
conn.line.width = Pt(width)
return conn
def add_notes(slide, text):
slide.notes_slide.notes_text_frame.text = text
def slide_title(prs):
s = prs.slides.add_slide(prs.slide_layouts[6])
add_bg(s)
add_rect(s, 0.75, 1.15, 0.055, 4.95, fill=GREEN, shape=MSO_SHAPE.RECTANGLE)
add_text(s, 1.05, 0.72, 8.2, 0.3,
'ФОРУМ МОЛОДЁЖИ ДОНБАССА • СМЕНА 1 «ПСБ ПАТРИОТ»',
size=10, color=GRAY, bold=True)
add_text(s, 1.0, 1.32, 8.3, 2.35, 'МЕТОД\nДЕГТЯРЕВА',
font='Georgia', size=54, color=WHITE, bold=True, line_spacing=0.92)
add_text(s, 1.05, 3.78, 8.2, 0.55, 'Цифра, у которой есть хозяин',
font='Georgia', size=24, color=GREEN, italic=True)
add_text(s, 1.05, 4.48, 8.2, 0.4, 'От забоя до миллиона роз',
size=14, color=GRAY)
add_text(s, 1.05, 5.05, 8.2, 0.35, 'Бойко К.С. • эксперт и наставник трека',
size=11, color=GREEN_LIGHT, bold=True)
add_line(s, 1.05, 6.18, 8.4, 6.18, color='2A2F34', width=1.0)
add_text(s, 1.05, 6.38, 8.2, 0.35, '3 дня • 5 шагов • 1 защита',
size=11, color=DARK_GRAY)
# Big 5 circle
add_rect(s, 9.55, 1.55, 3.1, 3.1, fill=None, line=GREEN, line_w=1.5,
shape=MSO_SHAPE.OVAL)
add_text(s, 9.55, 1.72, 3.1, 1.9, '5', font='Georgia', size=96,
color=GREEN, bold=True, align=PP_ALIGN.CENTER,
anchor=MSO_ANCHOR.MIDDLE)
add_text(s, 9.55, 3.62, 3.1, 0.35, 'ШАГОВ', size=12, color=GRAY,
bold=True, align=PP_ALIGN.CENTER)
add_rect(s, 12.28, 4.28, 0.34, 0.34, fill=ROSE, shape=MSO_SHAPE.OVAL)
add_notes(s, 'Хук: В 1970-х ЮНЕСКО назвала Донецк самым зелёным промышленным городом планеты. '
'Город, который мы привыкли называть всесоюзной кочегаркой. Это сделал человек, '
'у которого не было ни интернета, ни смартфона, ни искусственного интеллекта. '
'Его звали Владимир Дегтярев. И у него был метод. За три дня мы применим этот метод к цифре.')
return s
def slide_paradox(prs):
s = prs.slides.add_slide(prs.slide_layouts[6])
add_bg(s)
add_text(s, 0.75, 0.55, 11.8, 0.7, 'Парадокс, который стоит изучать',
font='Georgia', size=30, color=WHITE, bold=True)
add_text(s, 0.75, 1.22, 11.8, 0.4,
'Донецк: из «всесоюзной кочегарки» — в самый зелёный промышленный город планеты',
size=13, color=GRAY)
# Left card
add_rect(s, 0.75, 2.0, 4.55, 2.15, fill=CARD)
add_text(s, 1.0, 2.2, 4.05, 0.3, 'ДО 1963', size=10, color=DARK_GRAY, bold=True)
add_text(s, 1.0, 2.55, 4.05, 0.95, 'ВСЕСОЮЗНАЯ\nКОЧЕГАРКА',
font='Georgia', size=22, color=GRAY, bold=True, line_spacing=0.95)
add_text(s, 1.0, 3.55, 4.05, 0.4, 'уголь, бараки, дефицит воды', size=11, color=DARK_GRAY)
# Arrow
add_rect(s, 5.55, 2.82, 0.65, 0.5, fill=GREEN, shape=MSO_SHAPE.RIGHT_ARROW)
# Right card
add_rect(s, 6.45, 2.0, 6.1, 2.15, fill=CARD)
add_text(s, 6.7, 2.2, 5.6, 0.3, '1970-Е', size=10, color=GREEN, bold=True)
add_text(s, 6.7, 2.55, 5.6, 1.0, 'САМЫЙ ЗЕЛЁНЫЙ\nПРОМЫШЛЕННЫЙ ГОРОД\nПЛАНЕТЫ',
font='Georgia', size=19, color=GREEN, bold=True, line_spacing=0.95)
add_text(s, 6.7, 3.62, 5.6, 0.35, 'ЮНЕСКО. Миллион роз. Ботанический сад.',
size=11, color=GRAY)
# Stats
stats = [
('3,1×', 'рост жилищного фонда', GREEN),
('5', 'академических институтов', GREEN),
('1 000 000', 'кустов роз', ROSE),
]
x = 0.75
for num, label, color in stats:
add_rect(s, x, 4.65, 3.8, 1.45, fill=CARD2)
add_text(s, x + 0.25, 4.82, 3.3, 0.65, num, font='Georgia', size=32,
color=color, bold=True)
add_text(s, x + 0.25, 5.5, 3.3, 0.35, label, size=10.5, color=GRAY)
x += 4.0
add_text(s, 0.75, 6.55, 11.8, 0.3,
'По материалам Донецкого агентства новостей, 20.02.2026',
size=9, color=DARK_GRAY)
add_notes(s, 'Парадокс: город угля и бараков стал самым зелёным промышленным городом планеты. '
'Жильё выросло в 3,1 раза, появился научный центр из пяти институтов, миллион роз. '
'Вопрос: как? Ответ — метод.')
return s
def slide_man(prs):
s = prs.slides.add_slide(prs.slide_layouts[6])
add_bg(s)
add_text(s, 0.75, 0.55, 11.8, 0.7, 'Человек, который не был айтишником',
font='Georgia', size=30, color=WHITE, bold=True)
add_text(s, 0.75, 1.22, 11.8, 0.4,
'Владимир Иванович Дегтярев (1920–1993) — «хозяин Донбасса»',
size=13, color=GRAY)
facts = [
('1920', 'Родился под Ставрополем в семье железнодорожного рабочего'),
('1948', 'Назначен на шахту «Центральная» в Чистяково (Торез)'),
('1953', 'Возглавил трест «Чистяковантрацит». Ему неполных 33 года'),
('1963–1976', 'Первый секретарь Донецкого обкома. 13 лет преобразований'),
]
x = 0.75
for year, text in facts:
add_rect(s, x, 2.0, 2.85, 2.55, fill=CARD)
add_text(s, x + 0.22, 2.2, 2.4, 0.55, year, font='Georgia', size=24,
color=GREEN, bold=True)
add_text(s, x + 0.22, 2.85, 2.4, 1.5, text, size=10.5, color=WHITE,
line_spacing=1.1)
x += 3.05
# Quote
add_rect(s, 0.75, 4.95, 11.8, 1.25, fill=CARD2)
add_rect(s, 0.75, 4.95, 0.06, 1.25, fill=ROSE, shape=MSO_SHAPE.RECTANGLE)
add_text(s, 1.05, 5.12, 11.2, 0.6,
'«Опыта в работе мало, да и годы невелики: было всего неполных 33 года».',
font='Georgia', size=16, color=WHITE, italic=True)
add_text(s, 1.05, 5.78, 11.2, 0.3, '— В. И. Дегтярев', size=10, color=GRAY)
add_text(s, 0.75, 6.5, 11.8, 0.35,
'Его называли «хозяином» не за должность, а за метод.',
size=12, color=GREEN_LIGHT, bold=True)
add_notes(s, 'Биография: горный инженер, начальник участка шахты, в 32 года — управляющий трестом, '
'в 43 — первый секретарь обкома. За 13 лет: жильё, наука, культура, зелёный город. '
'Он не был айтишником. Он был хозяином.')
return s
def slide_method(prs):
s = prs.slides.add_slide(prs.slide_layouts[6])
add_bg(s)
add_text(s, 0.75, 0.55, 11.8, 0.7, 'Пять шагов хозяина',
font='Georgia', size=30, color=WHITE, bold=True)
add_text(s, 0.75, 1.22, 11.8, 0.4,
'Каждый шаг — вопрос и артефакт на канвасе',
size=13, color=GRAY)
steps = [
('01', 'ЗАБОЙ', 'Что болит\nна самом деле?', 'Карта проблемы', GREEN),
('02', 'СМЕТА', 'Кому и насколько\nстанет лучше?', 'Портрет + метрики', GREEN),
('03', 'ЗАВОД', 'Что нужно, чтобы\nрешалось системно?', 'Архитектура + ресурсы', GREEN),
('04', 'РОЗА', 'Как люди это\nпочувствуют?', 'Ценность + MVP', ROSE),
('05', 'ХОЗЯИН', 'Кто останется\nпосле нас?', 'Устойчивость + план', ROSE),
]
x = 0.75
for num, name, question, artifact, color in steps:
add_rect(s, x, 2.0, 2.3, 3.85, fill=CARD)
add_text(s, x + 0.2, 2.18, 1.9, 0.3, num, size=12, color=color, bold=True)
add_text(s, x + 0.2, 2.55, 1.9, 0.45, name, font='Georgia', size=19,
color=WHITE, bold=True)
add_text(s, x + 0.2, 3.15, 1.9, 0.95, question, size=11, color=GRAY,
line_spacing=1.1)
add_line(s, x + 0.2, 4.35, x + 2.1, 4.35, color='2E3439', width=1.0)
add_text(s, x + 0.2, 4.5, 1.9, 0.7, artifact, size=9.5, color=color,
bold=True, line_spacing=1.05)
x += 2.45
add_text(s, 0.75, 6.25, 11.8, 0.4,
'Метод работает и для проекта, и для карьеры, и для региона.',
size=12, color=GREEN_LIGHT, bold=True)
add_notes(s, 'Метод: Забой — спустись туда, где реально болит. Смета — посчитай в людях, а не в отчётах. '
'Завод — построй систему, а не разовую акцию. Роза — сделай результат видимым и желанным. '
'Хозяин — останься после запуска.')
return s
def slide_map(prs):
s = prs.slides.add_slide(prs.slide_layouts[6])
add_bg(s)
add_text(s, 0.75, 0.55, 11.8, 0.7, 'Три дня — пять шагов',
font='Georgia', size=30, color=WHITE, bold=True)
add_text(s, 0.75, 1.22, 11.8, 0.4,
'Лекции дают контекст. Лаборатории дают артефакты. Защита даёт обратную связь.',
size=13, color=GRAY)
add_line(s, 0.9, 3.05, 12.45, 3.05, color='2E3439', width=2.0)
nodes = [
('10.11 • 19:30', 'Установка', 'Зачем и как', 1.9),
('11.11 • 10:45', 'Забой + Смета', 'Проблема и пользователь', 4.9),
('11.11 • 18:00', 'Завод + Роза', 'Решение и ценность', 7.9),
('12.11 • 10:30', 'Хозяин', 'Устойчивость и метрики', 10.9),
]
for date, title, desc, cx in nodes:
add_rect(s, cx - 0.11, 2.94, 0.22, 0.22, fill=GREEN, shape=MSO_SHAPE.OVAL)
add_text(s, cx - 1.25, 2.35, 2.5, 0.3, date, size=10.5, color=GREEN,
bold=True, align=PP_ALIGN.CENTER)
add_text(s, cx - 1.4, 3.35, 2.8, 0.4, title, font='Georgia', size=15,
color=WHITE, bold=True, align=PP_ALIGN.CENTER)
add_text(s, cx - 1.4, 3.78, 2.8, 0.6, desc, size=10, color=GRAY,
align=PP_ALIGN.CENTER, line_spacing=1.05)
chips = [
'Цифровая трансформация',
'Ограничения как топливо',
'Технология человечная',
'Регион как лаборатория',
'ИИ в действии',
]
x = 0.75
for chip in chips:
add_rect(s, x, 5.0, 2.25, 0.55, fill=CARD, line='2E3439', line_w=0.75)
add_text(s, x + 0.1, 5.08, 2.05, 0.4, chip, size=9, color=GRAY,
align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE)
x += 2.4
add_text(s, 0.75, 6.15, 11.8, 0.4,
'14:45 — защита проектов. 3 минуты питч + 2 минуты вопросы.',
size=12, color=GREEN_LIGHT, bold=True)
add_notes(s, 'Карта трека: 10 ноября — установка. 11 ноября — проблема, пользователь, решение, ценность. '
'12 ноября — устойчивость, консультации, сборка и защита. Лекции работают на метод.')
return s
def slide_team(prs):
s = prs.slides.add_slide(prs.slide_layouts[6])
add_bg(s)
add_text(s, 0.75, 0.55, 11.8, 0.7, 'Команда = маленький обком',
font='Georgia', size=30, color=WHITE, bold=True)
add_text(s, 0.75, 1.22, 11.8, 0.4,
'5–7 человек. Разные специальности. Один канвас.',
size=13, color=GRAY)
roles = [
('ЗАБОЙЩИК', 'исследователь: поле, интервью, данные', GREEN),
('ИНЖЕНЕР', 'технарь: решение, архитектура, MVP', GREEN),
('ХОЗЯИН', 'экономист: ресурсы, метрики, устойчивость', ROSE),
('ГОЛОС', 'коммуникатор: питч, визуал, история', ROSE),
]
positions = [(0.75, 2.0), (3.9, 2.0), (0.75, 3.95), (3.9, 3.95)]
for (name, desc, color), (x, y) in zip(roles, positions):
add_rect(s, x, y, 2.95, 1.7, fill=CARD)
add_text(s, x + 0.22, y + 0.18, 2.5, 0.35, name, font='Georgia', size=15,
color=color, bold=True)
add_text(s, x + 0.22, y + 0.65, 2.5, 0.85, desc, size=10, color=GRAY,
line_spacing=1.1)
# Canvas preview
add_rect(s, 7.15, 2.0, 5.45, 4.25, fill=CARD2)
add_text(s, 7.4, 2.18, 4.9, 0.3, 'КАНВАС «МЕТОД ДЕГТЯРЕВА»', size=10,
color=GREEN, bold=True)
rows = [
('01', 'Забой', 'проблема и доказательства'),
('02', 'Смета', 'пользователь и метрики'),
('03', 'Завод', 'решение и ресурсы'),
('04', 'Роза', 'ценность и MVP'),
('05', 'Хозяин', 'устойчивость и план'),
]
y = 2.65
for num, name, desc in rows:
add_text(s, 7.4, y, 0.45, 0.3, num, size=9, color=GREEN, bold=True)
add_text(s, 7.85, y - 0.02, 1.3, 0.3, name, size=11, color=WHITE, bold=True)
add_text(s, 9.15, y, 3.2, 0.3, desc, size=9.5, color=GRAY)
add_line(s, 7.4, y + 0.42, 12.3, y + 0.42, color='2E3439', width=0.75)
y += 0.68
add_text(s, 0.75, 6.5, 11.8, 0.35,
'Канвас печатается на А4. Один на команду.',
size=11, color=DARK_GRAY)
add_notes(s, 'Роли: Забойщик, Инженер, Хозяин, Голос. Команда смешанная. Канвас — один на команду, '
'заполняется по шагам. Это не отчёт, а рабочий инструмент.')
return s
def slide_result(prs):
s = prs.slides.add_slide(prs.slide_layouts[6])
add_bg(s)
add_text(s, 0.75, 0.55, 11.8, 0.7, 'Что вы унесёте',
font='Georgia', size=30, color=WHITE, bold=True)
add_text(s, 0.75, 1.22, 11.8, 0.4,
'Проект не заканчивается защитой.',
size=13, color=GRAY)
# Left column
add_text(s, 0.75, 1.95, 5.5, 0.35, 'УЧАСТНИК', size=11, color=GREEN, bold=True)
left = [
('1', 'паспорт проекта'),
('3', 'минуты питча'),
('30/90', 'дней дорожная карта'),
('5', 'шагов методичка'),
]
y = 2.45
for num, label in left:
add_text(s, 0.75, y, 1.35, 0.55, num, font='Georgia', size=24,
color=GREEN, bold=True)
add_text(s, 2.15, y + 0.08, 4.0, 0.4, label, size=12, color=WHITE)
add_line(s, 0.75, y + 0.72, 6.1, y + 0.72, color='2E3439', width=0.75)
y += 0.9
# Right column
add_text(s, 6.95, 1.95, 5.5, 0.35, 'РЕГИОН', size=11, color=ROSE, bold=True)
right = [
('5–7', 'концепций цифровых сервисов'),
('1', 'банк проблем'),
('2–3', 'проекта к пилоту или гранту'),
('∞', 'тиражируемая методика'),
]
y = 2.45
for num, label in right:
add_text(s, 6.95, y, 1.35, 0.55, num, font='Georgia', size=24,
color=ROSE, bold=True)
add_text(s, 8.35, y + 0.08, 4.2, 0.4, label, size=12, color=WHITE)
add_line(s, 6.95, y + 0.72, 12.3, y + 0.72, color='2E3439', width=0.75)
y += 0.9
add_text(s, 0.75, 6.35, 11.8, 0.4,
'Лучшие проекты получают дорожную карту и поддержку партнёров.',
size=12, color=GREEN_LIGHT, bold=True)
add_notes(s, 'Результат: у участника — паспорт, питч, дорожная карта, методичка. '
'У региона — банк проблем, 5–7 концепций, 2–3 проекта к пилоту или гранту, '
'тиражируемая методика.')
return s
def slide_cta(prs):
s = prs.slides.add_slide(prs.slide_layouts[6])
add_bg(s)
add_rect(s, 0.75, 1.15, 0.055, 4.95, fill=ROSE, shape=MSO_SHAPE.RECTANGLE)
add_text(s, 1.05, 1.35, 8.2, 0.4, 'ЗАВТРА В 10:45', size=16, color=GREEN, bold=True)
add_text(s, 1.0, 1.9, 8.6, 1.2, 'Спуск в забой.',
font='Georgia', size=48, color=WHITE, bold=True)
add_text(s, 1.05, 3.35, 8.4, 1.2, 'Приходите с проблемой,\nа не с идеей.',
font='Georgia', size=26, color=ROSE, italic=True, line_spacing=1.05)
add_text(s, 1.05, 4.95, 8.2, 0.4, 'Зал «Жуков 2»', size=14, color=GRAY)
add_line(s, 1.05, 6.15, 8.4, 6.15, color='2A2F34', width=1.0)
add_text(s, 1.05, 6.35, 8.2, 0.35,
'Метод Дегтярева • Цифра, у которой есть хозяин',
size=11, color=DARK_GRAY)
# Decorative circle
add_rect(s, 9.55, 1.55, 3.1, 3.1, fill=None, line=ROSE, line_w=1.5,
shape=MSO_SHAPE.OVAL)
add_text(s, 9.55, 2.55, 3.1, 1.1, '→', font='Georgia', size=64,
color=ROSE, bold=True, align=PP_ALIGN.CENTER,
anchor=MSO_ANCHOR.MIDDLE)
add_notes(s, 'Вызов: завтра в 10:45 — спуск в забой. Зал «Жуков 2». '
'Приходите с проблемой, а не с идеей. Дальше — метод Дегтярева.')
return s
def build():
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
slide_title(prs)
slide_paradox(prs)
slide_man(prs)
slide_method(prs)
slide_map(prs)
slide_team(prs)
slide_result(prs)
slide_cta(prs)
prs.save(OUT)
print('saved', OUT)
if __name__ == '__main__':
build()