# -*- coding: utf-8 -*- """ Перезаписывает HTML-блоки услуг, чек-апов, публикаций и страниц из дампа после починки sqlread: раньше парсер отбрасывал слэш у escape-последовательностей, и \r\n попадал в текст буквами "rn" — на странице это видно как мусор. Обновляет только поле blocks по legacy_id. Ничего не создаёт и не удаляет. """ import sqlread, io P = 'D:/medkor-local/tmp/dana/db.sql' OUT = io.open('seed_fix_blocks.sql', 'w', encoding='utf-8') def esc(s): return "'" + str(s).replace("\\", "\\\\").replace("'", "''") + "'" def blocks_sql(detail): if not detail or not detail.strip() or detail == 'NULL': return "'[]'::jsonb" return "jsonb_build_array(jsonb_build_object('type','html','html'," + esc(detail) + "))" # инфоблок -> (таблица, нужен ли фильтр по активности) TARGETS = { '30': 'services', '50': 'checkups', '27': 'posts', '26': 'posts', '28': 'posts', } PAGES = {'21': 'about', '18': 'history'} OUT.write('BEGIN;\n') counts = {} for r in sqlread.rows(P, 'b_iblock_element'): ib = r['IBLOCK_ID'] detail = r.get('DETAIL_TEXT') if ib in TARGETS and r.get('ACTIVE') == 'Y': table = TARGETS[ib] OUT.write("UPDATE %s SET blocks=%s WHERE legacy_id=%s;\n" % ( table, blocks_sql(detail), r['ID'])) counts[table] = counts.get(table, 0) + 1 if ib in PAGES: OUT.write("UPDATE pages SET blocks=%s WHERE slug=%s;\n" % ( blocks_sql(detail), esc(PAGES[ib]))) counts['pages'] = counts.get('pages', 0) + 1 OUT.write('COMMIT;\n') OUT.close() print('операций обновления:', counts)